如何对列表进行反序列化?作为另一个列表<而不是只读的T[]

本文关键字:列表 只读 反序列化 另一个 | 更新日期: 2023-09-27 18:09:50

我们有一些代码来复制对象的List<T>。问题是代码返回T[]的只读数组,而不是List<T>

为什么会这样,我如何修复这个反序列化代码?

public interface ITestObject { }
[KnownType(typeof(ITestObject))]
[DataContract(Name = "TestObject")]
public class TestObject : ITestObject
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Value { get; set; }
}
public class TestApp
{
    public void Run()
    {
        IList<ITestObject> a = new List<ITestObject>();
        a.Add(new TestObject() { Id = 1, Value = "A" });
        a.Add(new TestObject() { Id = 2, Value = "B" });
        IList<ITestObject> b = Copy(a);
        // a is a List<T> while b is a readonly T[]
        Debug.WriteLine(a.GetType().FullName);
        Debug.WriteLine(b.GetType().FullName);
    }
    public IList<ITestObject> Copy(IList<ITestObject> list)
    {
        DataContractSerializer serializer = new DataContractSerializer(typeof(IList<ITestObject>), new Type[] { typeof(TestObject) });
        using (Stream stream = new MemoryStream())
        {
            serializer.WriteObject(stream, list);
            stream.Seek(0, SeekOrigin.Begin);
            IList<ITestObject> clone = (IList<ITestObject>)serializer.ReadObject(stream);
            stream.Close();
            return clone;
        }
    }
}

我猜这与List<T>没有被列为KnownType有关

如何对列表进行反序列化?作为另一个列表<而不是只读的T[]

尝试使用DataContractSerializer(typeof(List<ITestObject>),以便它知道具体类型