.net – 使用DataContractSerializer序列化没有命名空间的对象
发布时间:2020-12-16 08:12:19 所属栏目:百科 来源:网络整理
导读:如何从使用DataContractSerializer序列化的对象的XML表示中删除XML命名空间? 该对象需要序列化为一个非常简单的输出XML。 最新最大的 – 使用.Net 4 beta 2 对象永远不需要反序列化。 XML不应该有任何xmlns:…命名空间refs 需要支持任何子类型的Exception
如何从使用DataContractSerializer序列化的对象的XML表示中删除XML命名空间?
该对象需要序列化为一个非常简单的输出XML。 >最新&最大的 – 使用.Net 4 beta 2 目的: [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="")] 在这种情况下,数据合约序列化程序不会为序列化对象使用任何命名空间。 马克 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |