当基类作为param传入时,反序列化派生类型

时间:2018-04-11 17:45:56

标签: c#

我有一组方法来序列化/反序列化我的自定义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;
    }
}

2 个答案:

答案 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指出反序列化将按原样正确发生。