C# 4.0 使用ServiceStack.Text时无法匹配旧版序列化XML
下面是一个遗留消息类,它具有所有XML属性以及使用内置.NET序列化程序生成的输出:C# 4.0 使用ServiceStack.Text时无法匹配旧版序列化XML,c#-4.0,servicestack-text,C# 4.0,servicestack Text,下面是一个遗留消息类,它具有所有XML属性以及使用内置.NET序列化程序生成的输出: [Serializable] [XmlRoot(Namespace = http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd", ElementName = "message", IsNullable = true)] public class MessageModel { [XmlElemen
[Serializable]
[XmlRoot(Namespace = http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd", ElementName = "message", IsNullable = true)]
public class MessageModel
{
[XmlElement(ElementName = "type")]
public string ShipmentType { get; set; }
[XmlElement(ElementName = "version")]
public int? Version { get; set; }
[XmlElement(ElementName = "id")]
public string ID { get; set; }
[XmlElement(ElementName = "message-id")]
public string MessageID { get; set; }
[XmlElement(ElementName = "date")]
public string Date { get; set; }
[XmlElement(ElementName = "payload")]
public string Payload { get; set; }
[XmlElement(ElementName = "ip-address")]
public string IpAddress { get; set; }
}
它生成以下XML
<?xml version="1.0" encoding="utf-8"?>
<q1:message xmlns:q1="http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd">
<q1:type>Test</q1:type>
<q1:version d2p1:nil="true" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance" />
<q1:id>9976</q1:id>
<q1:message-id>1</q1:message-id>
<q1:date>2/22/2017 4:50:01 PM</q1:date>
<q1:payload>Test Payload</q1:payload>
<q1:ip-address>192.168.1.1</q1:ip-address>
</q1:message>
它在使用ServiceStack.Text执行.ToXml()时生成以下XML
<?xml version="1.0" encoding="utf-8"?>
<message xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd">
<date>2/22/2017 4:50:01 PM</date>
<id>9976</id>
<ip-address>192.168.1.1</ip-address>
<message-id>1</message-id>
<payload>Test Payload</payload>
<type>Test</type>
<version i:nil="true" />
</message>
2017年2月22日下午4:50:01
9976
192.168.1.1
1.
测试有效载荷
试验
首先,添加了额外的名称空间,我可以手动删除它。然而,我不知道原始元素中每个元素前面的“q1:”是从哪里来的
是否有任何配置可以更改以使ServiceStack生成完全相同的XML消息?ServiceStack使用.NET Framework的内置XML,其中可通过
[DataContract]
和[DataMember]进行有限定制
属性和,您可以在其中为不同的C#命名空间设置全局命名空间
尽管如此,这两个XML文档在语义上是相同的。q1
是一个自动生成的名称空间别名,表示前缀为q1:
的每个元素或属性都来自引用的架构。xsd
:
<q1:message xmlns:q1="http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd">
<message xmlns="http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd">
因此,它们在语义上应该是等价的,但是如果您的客户机希望使用完全相同的XML,那么我会使用完全相同的模型和序列化程序,只返回生成的XML,例如:
[AddHeader(ContentType = "text/xml")]
public object Any(MyRequest request)
{
var response = ...;
var xml = XmlSerializer.SerializeToString(response);
return xml;
}
ServiceStack使用.NET Framework的内置XML,其中可通过
[DataContract]
和[DataMember]
属性进行有限的定制,并且可以为不同的C#命名空间设置全局命名空间
尽管如此,这两个XML文档在语义上是相同的。q1
是一个自动生成的名称空间别名,表示前缀为q1:
的每个元素或属性都来自引用的架构。xsd
:
<q1:message xmlns:q1="http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd">
<message xmlns="http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd">
因此,它们在语义上应该是等价的,但是如果您的客户机希望使用完全相同的XML,那么我会使用完全相同的模型和序列化程序,只返回生成的XML,例如:
[AddHeader(ContentType = "text/xml")]
public object Any(MyRequest request)
{
var response = ...;
var xml = XmlSerializer.SerializeToString(response);
return xml;
}