我有以下数据合同:
[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>
答案 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
来表示它。
您不能引入基类类型,使您的集合成为该基类型的集合,并从该基类派生您的两个独立类型吗?