C# 如何反序列化列表<;T>;作为另一个列表<;T>;而不是只读的T[]?

C# 如何反序列化列表<;T>;作为另一个列表<;T>;而不是只读的T[]?,c#,datacontractserializer,C#,Datacontractserializer,我们有一些代码可以复制对象的列表。问题是代码返回的是一个只读数组T[],而不是列表 为什么会这样,我如何修复这个反序列化代码 public interface ITestObject { } [KnownType(typeof(ITestObject))] [DataContract(Name = "TestObject")] public class TestObject : ITestObject { [DataMember] public int Id { get; se

我们有一些代码可以复制对象的
列表
。问题是代码返回的是一个只读数组
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;
        }
    }
}
公共接口ITestObject{}
[知识类型(类型(ITestObject))]
[DataContract(Name=“TestObject”)]
公共类测试对象:ITestObject
{
[数据成员]
公共int Id{get;set;}
[数据成员]
公共字符串值{get;set;}
}
公共类测试
{
公开募捐
{
IList a=新列表();
a、 添加(newtestobject(){Id=1,Value=“a”});
a、 添加(newtestobject(){Id=2,Value=“B”});
IList b=副本(a);
//a是一个列表,而b是一个只读的T[]
Debug.WriteLine(a.GetType().FullName);
Debug.WriteLine(b.GetType().FullName);
}
公共IList副本(IList列表)
{
DataContractSerializer serializer=新的DataContractSerializer(typeof(IList),新类型[]{typeof(TestObject)});
使用(Stream=newmemoryStream())
{
serializer.WriteObject(流,列表);
stream.Seek(0,SeekOrigin.Begin);
IList clone=(IList)serializer.ReadObject(流);
stream.Close();
返回克隆;
}
}
}

我猜这与以下事实有关:
List
没有列为
KnownType

尝试使用
DataContractSerializer(typeof(List)
以便它知道具体的类型

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

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

尝试使用
DataContractSerializer(typeof(List)
这样它就可以知道具体的类型了

谢谢,这就是我所缺少的。我知道它会像这样简单,但还没有使用
DataContractSerializer
来知道要检查什么:)谢谢,这就是我所缺少的。我知道它会像这样简单,但还没有使用
DataContractSerializer
足够知道要检查什么:)谢谢,这就是我所缺少的。我知道它会像这样简单,但还没有使用
DataContractSerializer
足够知道要检查什么:)谢谢,这就是我所缺少的。我知道它会像这样简单,但还没有使用
DataContractSerializer
足够知道要检查什么:)