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
足够知道要检查什么:)