.net – 使用DataContractSerializer序列化没有命名空间的对象

如何从使用DataContractSerializer序列化的对象的XML表示中删除XML命名空间?

该对象需要序列化为一个非常简单的输出XML。

>最新&最大的 – 使用.Net 4 beta 2
>对象永远不需要反序列化。
> XML不应该有任何xmlns:…命名空间refs
>需要支持任何子类型的Exception和ISubObject。
>这将非常难以更改原始对象。

目的:

[Serializable] 
 class MyObj
 {
     string str;
     Exception ex;
     ISubObject subobj;
 }

需要序列化成:

<xml>
  <str>...</str>
  <ex i:nil="true" />
  <subobj i:type="Abc">
     <AbcProp1>...</AbcProp1>
     <AbcProp2>...</AbcProp2>
  </subobj>
</xml>

我使用这个代码:

private static string ObjectToXmlString(object obj)
{
    if (obj == null) throw new ArgumentNullException("obj");

    var serializer =
        new DataContractSerializer(
            obj.GetType(),null,Int32.MaxValue,false,new AllowAllContractResolver());

    var sb = new StringBuilder();
    using (var xw = XmlWriter.Create(sb,new XmlWriterSettings
    {
        OmitXmlDeclaration = true,NamespaceHandling = NamespaceHandling.OmitDuplicates,Indent = true
    }))
    {
        serializer.WriteObject(xw,obj);
        xw.Flush();

        return sb.ToString();
    }
}

this article我采用了一个DataContractResolver,所以没有子类型必须声明:

public class AllowAllContractResolver : DataContractResolver
{
    public override bool TryResolveType(Type dataContractType,Type declaredType,DataContractResolver knownTypeResolver,out XmlDictionaryString typeName,out XmlDictionaryString typeNamespace)
    {
        if (!knownTypeResolver.TryResolveType(dataContractType,declaredType,out typeName,out typeNamespace))
        {
            var dictionary = new XmlDictionary();
            typeName = dictionary.Add(dataContractType.FullName);
            typeNamespace = dictionary.Add(dataContractType.Assembly.FullName);
        }
        return true;
    }

    public override Type ResolveName(string typeName,string typeNamespace,DataContractResolver knownTypeResolver)
    {
        return knownTypeResolver.ResolveName(typeName,typeNamespace,null) ?? Type.GetType(typeName + "," + typeNamespace);
    }
}
你需要标记你想要序列化的类:
[DataContract(Namespace="")]

在这种情况下,数据合约序列化程序不会为序列化对象使用任何命名空间。

马克

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇