如何使用DataContractSerializer创建具有与我的已知类型匹配的标记名称的xml

时间:2010-05-26 11:59:13

标签: c# .net xml-serialization datacontractserializer

我有以下数据合同:

[CollectionDataContract(Name="MyStuff")] 
public class MyStuff : Collection<object> {}

[DataContract(Name = "Type1")]
[KnownType(typeof(Type1))]
public class Type1
{
    [DataMember(Name = "memberId")] public int Id { get; set; }
}

[DataContract(Name = "Type2")]
[KnownType(typeof(Type2))]
public class Type2
{
    [DataMember(Name = "memberId")] public int Id { get; set; }
}

我将其序列化为xml如下:

MyStuff pm = new MyStuff();

Type1 t1 = new Type1 { Id = 111 };
Type2 t2 = new Type2 { Id = 222 };

pm.Add(t1);
pm.Add(t2);

string xml;

StringBuilder serialXML = new StringBuilder();
DataContractSerializer dcSerializer = new DataContractSerializer(typeof(MyStuff));
using (XmlWriter xWriter = XmlWriter.Create(serialXML))
{
    dcSerializer.WriteObject(xWriter, pm);
    xWriter.Flush();
    xml = serialXML.ToString();
}

生成的xml字符串如下所示:

<?xml version="1.0" encoding="utf-16"?>
<MyStuff xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://schemas.datacontract.org/2004/07/">
    <anyType i:type="Type1">
        <memberId>111</memberId>
    </anyType>
    <anyType i:type="Type2">
        <memberId>222</memberId>
    </anyType>
</MyStuff>

是否有人知道如何使用我已知类型的名称而不是xml标记中的 anyType

我希望它看起来像这样:

<?xml version="1.0" encoding="utf-16"?>
<MyStuff xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://schemas.datacontract.org/2004/07/">
    <Type1>
        <memberId>111</memberId>
    </Type1>
    <Type2>
        <memberId>222</memberId>
    </Type2>
</MyStuff>

1 个答案:

答案 0 :(得分:1)

为什么你要这样做?

[DataContract(Name = "Type1")]
[KnownType(typeof(Type1))]
public class Type1
{
}

我认为这里不需要KnownType属性 - 在多态情况下需要它:如果你有一个方法返回BaseType并且可以返回派生类型Type1 : BaseType在它的位置。

如果您返回Type1并且您只有Type1作为类型,则该knownType属性是多余的。

第二个问题是:

public class MyStuff : Collection<object> {

如果你有一个object的集合 - 它可能是任何东西的集合 - 所以序列化程序将使用xs:anyType来表示它。

您不能引入基类类型,使您的集合成为该基类型的集合,并从该基类派生您的两个独立类型吗?