Google协议缓冲区 - protobuf-net反序列化无法正常工作

时间:2013-02-21 16:05:05

标签: c# serialization protobuf-net protocol-buffers

我在使用预编译的protobuff序列化程序类ModelSerializer序列化的字节数组中成功反序列化时遇到了困难。使用它,我定义的数据模型MyData中的类的序列化和反序列化在我序列化到文件并从文件反序列化为MyData时起作用。

但是,我有另一个要求,即将MyData序列化为字节数组,并将字节数组反序列化为MyData。下面是名为MyDataConverter的基本类,它有2个静态方法,一个用于将MyData转换为字节数组,另一个用于将字节数组转换为MyData

我可以成功将MyData序列化为字节数组并将其写入MemoryStream。但是,当我反序列化字节数组时,我确实获得了MyData的非空实例,但其中的所有数据都丢失了(自定义类型的默认值为零或null)。

我可以在这里出错吗?请注意,我确实使用类似的代码成功序列化到文件并从文件反序列化,所以它可能不是MyModel或预编译的ModelSerializer的错误。但如果有必要,我可以在这里粘贴一些信息。

public class MyDataConverter
{
    public static byte [] MyDataToBytes (MyData myData)
    {
        MemoryStream stream = new MemoryStream();
        ModelSerializer serializer = new ModelSerializer();

        serializer.Serialize (stream, myData);
        byte [] bytes = stream.ToArray();
        Stream.Close();

        return bytes;
    }

    public static MyData BytesToMyData (byte [] bytes)
    {
        MyData myData = null;

        MemoryStream stream = new MemoryStream();
        stream.Write (bytes, 0, bytes.Length);

        ModelSerializer serializer = new ModelSerializer();

        myData = (MyData) serializer.Deserialize (stream, myData, typeof (MyData));
        stream.Close();

        return myData;
    }
}

2 个答案:

答案 0 :(得分:10)

这是问题所在:

MemoryStream stream = new MemoryStream();
stream.Write (bytes, 0, bytes.Length);

ModelSerializer serializer = new ModelSerializer();
myData = (MyData) serializer.Deserialize (stream, myData, typeof (MyData));

当您尝试反序列化时,您仍然位于流的 end 。您可以在之后寻找开头,但更改代码以将字节数组传递给构造函数会更简单:

MemoryStream stream = new MemoryStream(bytes, false);        
ModelSerializer serializer = new ModelSerializer();
myData = (MyData) serializer.Deserialize (stream, myData, typeof (MyData));

答案 1 :(得分:-1)

我们可以将像List这样的对象列表作为输入传递给序列化器。