【问题标题】:Using DataContractSerializer and XmlSerializer both in a single service在单个服务中同时使用 DataContractSerializer 和 XmlSerializer
【发布时间】:2012-08-21 12:11:57
【问题描述】:

我有一个类似的 WCF 服务:

[ServiceContract]
ServiceInterface
{
    [OperationContract]
    FirstResponse FirstOperation(){}

    [OperationContract]
    SecondResponse SecondOperation(){}
}

我想要客户端的 XML 响应。据我所知,它使用 DataContractSerializer 。但是在 FirstReponse 中,我有一个数据成员,我想将其作为 XML 中的属性。我读过DataContractSerializer 不支持它。解决方案是使用XmlSerializer,但这会影响效率。 所以我想知道是否可以仅将XmlSerializer 用于一项操作,将DataContractSerializer 用于其余服务。如果是怎么办?将 FirstResponse 类视为:

[DataContract]
public class FirstResponse
{
    [DataMember]
    public int id;

    [DataMember]
    public string type1;
}

我想要 id 作为属性。

【问题讨论】:

    标签: c# wcf datacontractserializer xmlserializer


    【解决方案1】:

    您可以通过使用XmlSerializerFormat 属性装饰您的方法来指定应使用XmlSerializer 进行序列化:

    [ServiceContract]
    ServiceInterface
    {
        [OperationContract]
        [XmlSerializerFormat]
        FirstResponse FirstOperation(){}
    
        [OperationContract]
        SecondResponse SecondOperation(){}
    }
    

    编辑:我忘了提到,如果你想用 XmlSerializer 序列化 FirstResponse,那么就不需要该类型的 DataContract / DataMember 属性。您可以为 XmlSerializer 设置如下:

    public class FirstResponse
    {
        [XmlAttribute]
        public int id;
    
        [XmlElement]
        public string type1;
    }
    

    您可以根据您希望类型序列化的方式来改变serialization attributes。如果您有根本不想序列化的成员,那么您需要在这些成员上指定 [XmlIgnore],因为 XmlSerializerDataContractSerializer 不同的是选择退出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多