使用ServiceStack.Text时无法匹配旧的序列化XML

时间:2017-02-23 14:10:13

标签: c#-4.0 servicestack-text

以下是旧的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消息?

1 个答案:

答案 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;
}