在创建ServiceModel.Channels.Message时只序列化公共属性

本文关键字:序列化 属性 创建 ServiceModel Channels Message | 更新日期: 2023-09-27 17:54:04

我正在编写一个与外部web服务通信的应用程序,该应用程序通过IClientMessageInspector派生类传递所有请求和响应。为了测试它,我需要编写一个mock,它将接受一个被发送到web服务方法的对象,并将其转换为ServiceModel.Channels。消息,并传递给此检查器类。

对象是典型的WSLD自动生成类,它看起来像这样:

public partial class CreditInquiry : object, System.ComponentModel.INotifyPropertyChanged {
    private InquiryHeader inquiryHeaderField;
    private IndividualInquirySubscriberCategory subscriberCategoryField;
    [...]
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
    public InquiryHeader inquiryHeader {
        get {
            return this.inquiryHeaderField;
        }
        set {
            this.inquiryHeaderField = value;
            this.RaisePropertyChanged("inquiryHeader");
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
    public IndividualInquirySubscriberCategory subscriberCategory {
        get {
            return this.subscriberCategoryField;
        }
        set {
            this.subscriberCategoryField = value;
            this.RaisePropertyChanged("subscriberCategory");
        }
    }
    [...]
}

在我的模拟类中,我像这样生成Message对象:

  var requestType = request.GetType();
  var knownRequestTypes = new HashSet<Type>();
  GetTypesInClass(ref knownRequestTypes, requestType);
  var requestMessage = Message.CreateMessage(MessageVersion.Default, "", request, new DataContractSerializer(requestType, knownRequestTypes));

gettypeclass()方法遍历请求类型,并添加其中使用的每个属性和字段的类型,并且请求是被发送到WS方法的对象。

因此,当我在requestMessage对象上调用ToString()方法时,我得到以下表示:
<creditInquiry>
    <PropertyChanged xmlns:d5p1="http://schemas.datacontract.org/2004/07/System.ComponentModel" i:nil="true" />
    <inquiryHeaderField>
      [....]
    </inquiryHeaderField>
    <subscriberCategoryField i:nil="true" />        
</creditInquiry>

代替

<creditInquiry>
    <inquiryHeader>
      [....]
    </inquiryHeader>
    <subscriberCategory i:nil="true" />        
</creditInquiry>

如我所料。CreateMessage实际上序列化了一个对象的私有字段,并忽略它的公共属性。这能被规避吗?不幸的是,我是手动生成消息的新手,也许有一些额外的参数,我需要传递给CreateMessage,以获得所需的对象表示?

谢谢!

在创建ServiceModel.Channels.Message时只序列化公共属性

可以在元素的装饰中指定属性名。像这样更改InquiryHeader

的声明
[System.Xml.Serialization.XmlElementAttribute("InquiryHeader", typeof(InquiryHeader), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]