我有一组方法来序列化/反序列化我的自定义Message类。
这适用于Message
,但不适用于TestMessage
等派生类,因为反序列化器显然不知道数据,只返回我们告诉它的内容。
public class Message
{
public string Name {get; set; }
}
public class TestMessage : Message
{
public string OtherString {get; set; }
}
public byte[] SerializeMessage(Message message)
{
using (MemoryStream fs = new MemoryStream())
{
new BinaryFormatter().Serialize(fs, message);
return fs.ToArray();
}
}
public Message DeserializeMessage(byte[] data)
{
using (MemoryStream ms = new MemoryStream(data))
{
return new BinaryFormatter().Deserialize(ms) as Message;
}
}
答案 0 :(得分:1)
序列化版本包含有关类型的信息。反序列化字节数组时,该对象将是原始类型。
您可以通过调试代码来验证这一点。
一旦获得DeserializeMessage
的调用结果,您应该能够将其强制转换为原始类型,只要您知道它是什么。
或者,您可以修改方法以使用泛型:
public T DeserializeMessage<T>(byte[] data) where T:Message
{
using (MemoryStream ms = new MemoryStream(data))
{
return (T)new BinaryFormatter().Deserialize(ms);
}
}
然后这样称呼:
var message = DeserializeMessage<TestMessage>(bytes);
答案 1 :(得分:0)
我的问题实际上是因为我没有将[Serializable]
添加到我的TestMessage
课程中。我没有看到异常,因为我在async void
方法中执行此工作,调用方无法捕获异常。
@Manfred Radlwimmer和@JuanR指出反序列化将按原样正确发生。