C#引用对象的序列化

时间:2017-03-07 16:20:21

标签: c# xml serialization

我在序列化通过XML服务引用添加到项目中的对象时遇到问题。

通过服务引用引用的对象具有以下结构:

public class GetProspectsContactStatusParametersV1
{
    public GetProspectsContactStatusParametersV1()
    {
        Version = 1;
    }

    public int Version { get; set; }

    public ProspectIds ProspectIDs { get; set; }

    public InterestIds InterestIDs { get; set; }

    public class ProspectIds
    {
        private List<int> _prospectIds = new List<int>();
        [XmlElement("ProspectId")]
        public List<int> Items
        {
            get { return _prospectIds; }
            set { _prospectIds = value; }
        }
    }

    public class InterestIds
    {
        private List<int> _interestIds = new List<int>();
        [XmlElement("InterestId")]
        public List<int> Items
        {
            get { return _interestIds; }
            set { _interestIds = value; }
        }
    }
}

此代码构成了我在另一个应用程序中引用的Web Service项目的一部分。使用其他项目中的引用,我创建了上述对象的实例,如下所示:

var request = new ProspectsWebServiceMetadata.GetProspectsContactStatusParametersV1();
request.Version = 1;
request.InterestIDs = new ProspectsWebServiceMetadata.InterestIds
{
    2,3,4,5
};

然后我尝试使用基本的XmlSerializer将此对象序列化为XML:

public static string ToXmlString(object source)
{
    using (StringWriter sww = new StringWriter())
    using (XmlWriter writer = XmlWriter.Create(sww))
    {
        System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(source.GetType());

        ser.Serialize(writer, source);

        return sww.ToString();
    }
}

创建的XML如下:

<?xml version="1.0" encoding="utf-16"?>
    <GetProspectsContactStatusParametersV1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Version>1</Version>
    <InterestIDs>
        <int>2</int>
        <int>3</int>
        <int>4</int>
        <int>5</int>
    </InterestIDs>

“InterestIDs”中的上述XML部分应该具有“InterestID”而不是“int”。

作为导入引用的一部分生成的代码似乎表明它应该正确序列化,但显然它不会:

 [System.Diagnostics.DebuggerStepThroughAttribute()]
 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name="InterestIds", Namespace="http://www.testing.com/", ItemName="InterestId")]
[System.SerializableAttribute()]
public class InterestIds : System.Collections.Generic.List<int> {
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

CollectionDataContractAttribute的最终代码段中的属性实际上是标记DataContractSerializer的数据,而不是XmlSerializer