WCF 自动生成的类是使用字段后缀创建的,即使我使用的是 XmlSerializer

Posted

技术标签:

【中文标题】WCF 自动生成的类是使用字段后缀创建的,即使我使用的是 XmlSerializer【英文标题】:WCF auto generated classes are created with field suffixes even though I am using XmlSerializer 【发布时间】:2019-08-23 21:44:55 【问题描述】:

我有一个核心服务和一个微服务。微服务引用核心 WCF 服务。当我添加引用时,references.cs 包含我的私有属性公开为公共的类,并且我的所有属性都有一个字段后缀

例如:

public string SMCD get; set; 变成 private string sMCDField;

以下是我引用的类:

CoreInterface.cs

[ServiceContract(Namespace = Constants.Namespace, Name = "M3ApiCalls")]
public interface IService


    [System.ServiceModel.XmlSerializerFormatAttribute()]
    [OperationContractAttribute(AsyncPattern = true)]
    IAsyncResult BeginCRS100MI_List(string Salesperson, decimal Timestamp, AsyncCallback asyncCallback, object state);
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    CRS100MI_ListResult EndCRS100MI_List(IAsyncResult result);

    ...(more operations)

CRS100MI_ListResult.cs

[Serializable()]
[XmlSerializerFormat()]
[XmlRoot(ElementName = "CRS100MI_List",DataType = "System.Xml.XmlElement",Namespace = "http://companynamespace")]
public class CRS100MI_ListResult

    [XmlElement(Order = 0)]
    public string Result = "";

    [XmlElement(Order = 1)]
    public List<string> Messages = new List<string>();

    [XmlElement(Order = 2)]
    public List<M3Message> ResultMessage = new List<M3Message>();

    [XmlElement(Order = 3)]
    public List<CRS100MI_ListRecordResult> Record = new List<CRS100MI_ListRecordResult>();

    public CRS100MI_ListResult Parse(List<Dictionary<string, string>> list)
    
        //parses a list of dictionaries to CRS100MI_ListRecordResult
    


[Serializable()]
[XmlSerializerFormat()]
[XmlRoot(ElementName = "CRS100MI_ListRecord", DataType = "System.Xml.XmlElement", Namespace = "http://companynamespace")]
public class CRS100MI_ListRecordResult



    [XmlElement(Order = 0)]
    public string Result  get; set; 

    [XmlElement(Order = 1)]
    public string ErrorMessage  get; set; 

    [XmlElement(Order = 2)]
    public List<string> Messages  get; set; 

    [XmlElement(Order = 3)]
    public List<M3Message> ResultMessage  get; set; 

    [XmlElement(Order = 4)]
    public string SMCD  get; set; 

    [XmlElement(Order = 5)]
    public string TX40  get; set; 

    [XmlElement(Order = 6)]
    public string TX15  get; set; 

    [XmlElement(Order = 7)]
    public string SDEP  get; set; 

    [XmlElement(Order = 8)]
    public string BUAR  get; set; 

    [XmlElement(Order = 9)]
    public string PWMT  get; set; 

    [XmlElement(Order = 10)]
    public string SHOP  get; set; 

    [XmlElement(Order = 11)]
    public string LOSD  get; set; 



当我在我的微 wcf web 服务中调用这个核心 wcf 服务并返回结果时,它会序列化自动生成的类并给我

     <getCRS100StuffResult xmlns:a="http://schemas.datacontract.org/2004/07/RA_Tibco.CoreService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:PropertyChanged i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.ComponentModel"/>
        <a:messagesField i:nil="true" xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
        <a:recordField>
           <a:CRS100MI_ListRecordResult>
              <a:PropertyChanged i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.ComponentModel"/>
              <a:bUARField i:nil="true"/>
              <a:errorMessageField i:nil="true"/>
              <a:lOSDField>0</a:lOSDField>
              <a:messagesField i:nil="true" xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
              <a:pWMTField i:nil="true"/>

在搜索了一下之后,我偶然发现了以下 *** 问题: Why does WCF sometimes add "Field" to end of generated proxy types?

所以我确保按照给出的说明进行操作,但在保存、重新添加服务引用并将其添加到 SOAPUI 后,它仍然会出现此问题。我做错了什么?

【问题讨论】:

你不能序列化一个接口!!!请参阅:social.msdn.microsoft.com/Forums/en-US/… @jdweng 我不是在界面上声明格式吗?从接口声明中删除 [XmlSerializerFormat()] 什么也没做。 试试USE属性,在接口中加入如下代码。[ServiceContract,XmlSerializerFormat(Use =OperationFormatUse.Encoded)] @AbrahamQian 感谢您的意见,但遗憾的是它没有帮助。我还注意到,即使当我添加服务引用并选择集合类型为 System.Collections.Generic.List 时,它仍然会自动生成集合为数组的类。 【参考方案1】:

仔细查看您的CRS100MI_ListResult.cs,我注意到您没有使用DataContractDataMember 属性。

使用它们代替[Serializable()] 属性,它应该可以正常工作。

【讨论】:

但是由于我使用的是 XmlSerializer 而不是 DataContractSerializer,所以不需要它吗? 我决定按照你的方式改变它,所以我使用了 datacontractserializer,现在我可以看到它已经工作了。它仍然生成“-field”属性,但作为私有属性,正确的属性是公开的。

以上是关于WCF 自动生成的类是使用字段后缀创建的,即使我使用的是 XmlSerializer的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 XSD 中定义为属性时,自动生成的类中的字段会序列化为元素?

查找运行测试的类时出错,即使我在 IDE 中使用了自动测试创建功能

JAVA抽象类的定义与使用

EntityFramework 生成的类

JOOQ 代码生成器跳过包含 JsonNode 字段的类

Scala_类和对象