XML反序列化仅适用于xml中的命名空间
我使ServiceStack xml反序列化工作的最简单方法是xml包含命名空间。 但是,我收到的xml不包含名称空间。 最简单的工作示例:
[Serializable] public class test { } class Program { static void Main(string[] args) { string xml=""; var result = ServiceStack.Text.XmlSerializer.DeserializeFromString(xml); } }
但是,这不是我想要的。 我希望以下代码反序列化,因为这是我从几个服务获得的xml:
string xml="";
但这给了我以下错误:
DeserializeDataContract: Error converting type: Error in line 1 position 7. Expecting element 'test' from namespace 'https://schemas.datacontract.org/2004/07/'.. Encountered 'Element' with name 'test', namespace ''.
我试过了:
[Serializable] [XmlRoot("test", Namespace = "")] public class test
我无法创建新的Serializer,因为ServiceStack.Text.XmlSerializer是静态的。 我需要选择Microsoft XmlSerializer或ServiceStack(不是两者)。 含义:如果我无法使用这个简单的示例,我需要跳过ServiceStack包中另一个非常有用的部分。 我想要的最后一件事是在传入的xml中注入一些虚拟命名空间。
ServiceStack使用.NET的Xml DataContractSerializer来序列化XML以删除命名空间,您需要将命名空间设置为空字符串:
[DataContract(Namespace="")] public class test { ... }
但是,您必须使用[DataMember]属性标记要序列化的每个属性。 更好的选择是通过在Assembly.cs文件中添加和Assembly属性为C#命名空间下的所有类型指定一个空命名空间,例如:
[assembly: ContractNamespace("", ClrNamespace = "MyServiceModel.DtoTypes")]
注意:您可以删除[Serializable]属性 – 任何ServiceStack的序列化程序都不会使用它。 此外,像[XmlRoot]这样的所有XmlSerializer属性都是无用的,因为ServiceStack使用的是.NET的DataContractSerializer,而不是微软早期的XmlSerializer。
上述就是C#学习教程:XML反序列化仅适用于xml中的命名空间分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1016935.html