use*_*148 8 c# namespaces xmlserializer servicestack
使ServiceStack xml反序列化工作的最简单方法是xml包含命名空间.但是,我收到的xml不包含名称空间.最简单的工作示例:
[Serializable]
public class test
{
}
class Program
{
static void Main(string[] args)
{
string xml="<test xmlns=\"http://schemas.datacontract.org/2004/07/\"></test>";
var result = ServiceStack.Text.XmlSerializer.DeserializeFromString<test>(xml);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不是我想要的.我希望以下代码反序列化,因为这是我从几个服务获得的xml:
string xml="<test></test>";
Run Code Online (Sandbox Code Playgroud)
但是这给了我以下错误:
DeserializeDataContract: Error converting type: Error in line 1 position 7.
Expecting element 'test' from namespace
'http://schemas.datacontract.org/2004/07/'..
Encountered 'Element' with name 'test', namespace ''.
Run Code Online (Sandbox Code Playgroud)
我试过了:
[Serializable]
[XmlRoot("test", Namespace = "")]
public class test
Run Code Online (Sandbox Code Playgroud)
我无法创建新的Serializer,因为ServiceStack.Text.XmlSerializer是静态的.我需要选择Microsoft XmlSerializer或ServiceStack(不是两者).含义:如果我不能让这个简单的例子工作,我需要跳过ServiceStack包中另一个非常有用的部分.我想要的最后一件事是在传入的xml中注入一些虚拟命名空间.
myt*_*thz 24
ServiceStack使用.NET的Xml DataContractSerializer序列化XML以删除命名空间,您需要将命名空间设置为空字符串:
[DataContract(Namespace="")]
public class test { ... }
Run Code Online (Sandbox Code Playgroud)
但是,您必须使用[DataMember]属性标记要序列化的每个属性.更好的选择是通过在Assembly.cs文件中添加和Assembly属性为C#命名空间下的所有类型指定一个空命名空间,例如:
[assembly: ContractNamespace("", ClrNamespace = "MyServiceModel.DtoTypes")]
Run Code Online (Sandbox Code Playgroud)
注意:您可以删除[Serializable]属性 - 任何ServiceStack的序列化程序都不会使用它.此外,像[XmlRoot]这样的所有XmlSerializer属性都是无用的,因为ServiceStack使用的是.NET的DataContractSerializer,而不是微软早期的XmlSerializer.
| 归档时间: |
|
| 查看次数: |
13254 次 |
| 最近记录: |