以下是旧的Message类,其中包含使用内置.NET序列化程序生成的输出的所有XML属性:
[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的新DTO如下所示:
[DataContract(Namespace = "http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd", Name = "message")]
public class TIBCOMessage
{
[DataMember(Name = "type")]
public string ShipmentType { get; set; }
[DataMember(Name = "version")]
public int? Version { get; set; }
[DataMember(Name = "id")]
public string Id { get; set; }
[DataMember(Name = "message-id")]
public string MessageId { get; set; }
[DataMember(Name = "date")]
public string Date { get; set; }
[DataMember(Name = "payload")]
public string Payload { get; set; }
[DataMember(Name = "ip-address")]
public string IPAddress { get; set; }
}
在使用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>
首先,添加了额外的命名空间,我可以手动删除。但是,我不知道原始的每个元素前面的“q1:”来自哪里。
我是否可以更改任何配置以使ServiceStack生成完全相同的XML消息?
答案 0 :(得分:0)
ServiceStack使用.NET Framework的内置XML DataContractSerializer,其中可用的有限自定义是通过[DataContract]
和[DataMember]
属性以及Assembly ContractNamespaceAttribute您可以设置的不同C#名称空间的全局命名空间。
说过2个XML文档在语义上是相同的。 q1
是一个自动生成的命名空间别名,表示前缀为q1:
的每个元素或属性来自引用的Schema.xsd
:
<q1:message xmlns:q1="http://www.tibco.com/schemas/TestTcpServer/Schemas/Schema.xsd">
DataContract XML表示它使用的是默认的XML命名空间,因此每个没有命名空间前缀的Element或Attribute都来自引用的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;
}