继承类的输出无效

c0r*_*0rd 7 c# xml inheritance datacontractserializer

我有2节课

[DataContract, KnownType(typeof(B))]
public class A
{
    [DataMember]
    public string prop1 { get; set; }
    [DataMember]
    public string prop2 { get; set; }
    [DataMember]
    public string prop3 { get; set; }
}

[DataContract]
public class B : A
{
    [DataMember]
    public string prop4 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以及以下方法:

List<B> BList = new List<B>();
BList = new List<B>() { new B() { prop1 = "1", prop2 = "2", prop3 = "3", prop4 = "4" } };
List<A> AList = BList.Cast<A>().ToList();
DataContractSerializer ser = new DataContractSerializer(typeof(List<A>));
FileStream fs = new FileStream(@"C:\temp\AResult.xml", FileMode.Create);
using (fs)
{
    ser.WriteObject(fs, AList);
}
Run Code Online (Sandbox Code Playgroud)

将其写入输出的XML文件:

<ArrayOfProgram.A xmlns="http://schemas.datacontract.org/2004/07/foo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Program.A i:type="Program.B">
<prop1>1</prop1>
<prop2>2</prop2>
<prop3>3</prop3>
<prop4>4</prop4>
</Program.A></ArrayOfProgram.A>
Run Code Online (Sandbox Code Playgroud)

怎么可能发生,这prop4是在结果中,我怎么能避免这种情况?prop4不是其中一部分List<A>被序列化.

San*_*ojo 5

这是因为您在AList中存储指向B对象实例的指针.当你执行"new B(){prop1 ="1",prop2 ="2",prop3 ="3",prop4 ="4"}"你创建了一个B对象实例.当序列化程序反映存储在AList中的对象时,它会找到一个实际的B对象实例,因为你没有更改B对象实例,只能将它存储在AList中.编译器允许你这样做,因为继承链允许它,但B对象实例没有改变,那么它是一个B对象实例,无论你存储它的地方.

而不是做:

List<A> AList = BList.Cast<A>().ToList();
Run Code Online (Sandbox Code Playgroud)

做:

List<A> AList = BList.Select(b => new A() 
{ prop1 = b.prop1, prop2 = b.prop2, prop3 = b.prop3 })
.ToList();
Run Code Online (Sandbox Code Playgroud)

这将为BList中的每个B实例创建一个新的A实例

  • 你知道你可以[编辑]你的答案吗? (2认同)
  • 为了更容易地进行此属性映射,您可以考虑使用automapper.http://automapper.org/ (2认同)