无法反序列化派生 class。但如果它在列表或字典中,它就会起作用。有什么想法吗?
Cant deserilize derived class. But it works if it's in a list or a dictionary. Any thoughts?
我遇到了一个奇怪的问题,我可以序列化一个派生的 class,如果我把它放在一个列表中,但当它独立存在时就不行。
我正在使用这些方法进行序列化和反序列化(找到它们 here):
public static string Serialize(T obj)
{
using (MemoryStream memoryStream = new MemoryStream())
using (StreamReader reader = new StreamReader(memoryStream))
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
serializer.WriteObject(memoryStream, obj);
memoryStream.Position = 0;
return reader.ReadToEnd();
}
}
public static T Deserialize(string xml, Type toType)
{
using (Stream stream = new MemoryStream())
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
stream.Write(data, 0, data.Length);
stream.Position = 0;
DataContractSerializer deserializer = new DataContractSerializer(toType);
return (T)deserializer.ReadObject(stream);
}
}
我有一个基地 class Entity
。和派生 class Thing
.
[DataContract]
[KnownType(typeof(Thing))]
Class Entity
{
}
[DataContract]
Class Thing : Entity
{
}
现在,当我尝试序列化实例化为 Thing
的对象时没有问题,但反序列化会出错。
Thing e = new Thing();
string xmlstring = XML<Entity>.Serialize(e);
Entity testE = XML<Entity>.Deserialize(xmlstring, typeof(Entity));
错误类似于 Expected element Entity from ... . Element Thing was found.
(不是用英语写的。)
但奇怪的是,如果我将对象放入列表并序列化-反序列化列表,它会起作用。
Thing e = new Thing();
List<Entity> test = new List<Entity>();
test.Add(e);
var xmlstring = XML<List<Entity>>.Serialize(test);
List<Entity> test2 = XML<List<Entity>>.Deserialize(xmlstring, typeof(List<Entity>));
现在 test2
有一个包含正确 Thing
项的条目。即使这可能是一种解决方法,它肯定必须是一种更简单的方法,而且我认为它必须是易于修复的东西?有什么想法吗?我错过了什么?
(当然,它在将我的 Thing
对象反序列化为 Thing
对象时有效,但这不是我想要的,反序列化时我事先不知道 class .)
在考虑 @Jaya's 评论后,我似乎找到了解决方法。我修改了序列化方法以强制它序列化为基础 class 类型。原本我认为这行不通,但它确实行得通!
public static string Serialize(T obj, Type toType)
{
using (MemoryStream memoryStream = new MemoryStream())
using (StreamReader reader = new StreamReader(memoryStream))
{
DataContractSerializer serializer = new DataContractSerializer(toType);
serializer.WriteObject(memoryStream, obj);
memoryStream.Position = 0;
return reader.ReadToEnd();
}
}
我遇到了一个奇怪的问题,我可以序列化一个派生的 class,如果我把它放在一个列表中,但当它独立存在时就不行。
我正在使用这些方法进行序列化和反序列化(找到它们 here):
public static string Serialize(T obj)
{
using (MemoryStream memoryStream = new MemoryStream())
using (StreamReader reader = new StreamReader(memoryStream))
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
serializer.WriteObject(memoryStream, obj);
memoryStream.Position = 0;
return reader.ReadToEnd();
}
}
public static T Deserialize(string xml, Type toType)
{
using (Stream stream = new MemoryStream())
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
stream.Write(data, 0, data.Length);
stream.Position = 0;
DataContractSerializer deserializer = new DataContractSerializer(toType);
return (T)deserializer.ReadObject(stream);
}
}
我有一个基地 class Entity
。和派生 class Thing
.
[DataContract]
[KnownType(typeof(Thing))]
Class Entity
{
}
[DataContract]
Class Thing : Entity
{
}
现在,当我尝试序列化实例化为 Thing
的对象时没有问题,但反序列化会出错。
Thing e = new Thing();
string xmlstring = XML<Entity>.Serialize(e);
Entity testE = XML<Entity>.Deserialize(xmlstring, typeof(Entity));
错误类似于 Expected element Entity from ... . Element Thing was found.
(不是用英语写的。)
但奇怪的是,如果我将对象放入列表并序列化-反序列化列表,它会起作用。
Thing e = new Thing();
List<Entity> test = new List<Entity>();
test.Add(e);
var xmlstring = XML<List<Entity>>.Serialize(test);
List<Entity> test2 = XML<List<Entity>>.Deserialize(xmlstring, typeof(List<Entity>));
现在 test2
有一个包含正确 Thing
项的条目。即使这可能是一种解决方法,它肯定必须是一种更简单的方法,而且我认为它必须是易于修复的东西?有什么想法吗?我错过了什么?
(当然,它在将我的 Thing
对象反序列化为 Thing
对象时有效,但这不是我想要的,反序列化时我事先不知道 class .)
在考虑 @Jaya's 评论后,我似乎找到了解决方法。我修改了序列化方法以强制它序列化为基础 class 类型。原本我认为这行不通,但它确实行得通!
public static string Serialize(T obj, Type toType)
{
using (MemoryStream memoryStream = new MemoryStream())
using (StreamReader reader = new StreamReader(memoryStream))
{
DataContractSerializer serializer = new DataContractSerializer(toType);
serializer.WriteObject(memoryStream, obj);
memoryStream.Position = 0;
return reader.ReadToEnd();
}
}