如何使用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
来表示它。
您不能引入基类类型,使您的集合成为该基类型的集合,并从该基类派生您的两个单独类型吗?