代码之家  ›  专栏  ›  技术社区  ›  Liran

XML seriallization Problem using WCF

wcf
  •  1
  • Liran  · 技术社区  · 14 年前

    I have a WCF service that uses Message contract for request and replies of data. This is the service contract :

     [ServiceContract()]
     public interface ISalesFinderService
     {
         [OperationContract()]
         Response DoSomething(Request i_Info);
     }
    

    当服务返回响应时会出现问题。这是响应消息:

    [MessageContract()]
    public class ObjectInfo
    {
        [MessageBodyMember(Name = "Name")]
        public string  m_Name;
    }
    
    [MessageContract()]
    public class Response
    {
       private List<ObjectInfo> m_MyListOfObjects;
    
       public FindSalesByLocationInfoMessageResponse()
       {
           m_MyListOfObjects = new List<ObjectInfo>();
       }
    
       [MessageBodyMember(Name = "ObjectsInfo")]
       public List<ObjectInfo> MyListOfObjects
       {
                get { return m_MyListOfObjects;  }
                set { m_MyListOfObjects = value; }
       }
    }
    

    当响应出来时,我可以看到(通过wireshark)列表中的所有字段(类型为objectinfo)都被序列化为XML并获得了标记。 <a:m_Name></a:m_Name> although I added specifically MessageBodyMember attribute above the m_Name 数据成员,并将其标记为“name”。

    我怎样才能随心所欲地更改这些标签的名称????

    谢谢。。

    1 回复  |  直到 14 年前
        1
  •  1
  •   marc_s HarisH Sharma    14 年前

    我认为您误解了消息契约的原因以及如何使用它。查看上的msdn文档 Using Message Contracts for a more thorough discussion.

    消息协定允许您使用头和正文元素定义消息的布局。这些可以是像string或int这样的原子类型,如果不是,则需要将复合类型定义为类。

    Those composite parts (classes) that you use in that message contract ought to be marked as [DataContract] 具有 [DataMember] attributes on the individual fields you want to serialize.

    Furthermore, your message contract and data contracts should never contain any functions and anything that needs to execute. The data structures will be serialized as data only, any behavior will be lost in the transfer.

    So in your case, you should try:

    [MessageContract()]
    public class Response
    {
        private List<ObjectInfo> m_MyListOfObjects = new List<ObjectInfo>();
    
        [MessageBodyMember(Name = "ObjectsInfo")]
        public List<ObjectInfo> MyListOfObjects
        {
            get { return m_MyListOfObjects;  }
            set { m_MyListOfObjects = value; }
        }
    }
    
    [DataContract]
    public class ObjectInfo
    {
        [DataMember(Name = "Name")]
        public string m_Name;
    }