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

我有以下数据合同:

[CollectionDataContract(Name="MyStuff")] public class MyStuff : Collection {} [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字符串如下所示:

    111   222   

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

我希望它看起来像这样:

    111   222   

为什么你这样做?

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

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

如果你返回Type1并且你只是真的有Type1作为类型,那个knownType属性是多余的。

第二个问题是:

 public class MyStuff : Collection { 

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

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