C#Google.ProtocolBuffers反序列化方法(proto3)

时间:2016-02-11 10:20:57

标签: c# deserialization protocol-buffers proto3

我最近升级了我的代码库(Java,C ++和C#)以使用proto3。在C#的情况下,这涉及对代码的2000多个更改。这主要是语义的,都很好,但有一个问题我似乎无法理解;序列化/反序列化。我有以下修正方法来解除我的IMessage类型(在proto2中执行此操作的代码被注释),这是在GitHub存储库中的示例中显示的代码...

public static T ToObject<T>(this byte[] buf) where T : IMessage 
{
    if (buf == null)
        return default(T);

    using (MemoryStream ms = new MemoryStream())
    {
        ms.Write(buf, 0, buf.Length);
        ms.Seek(0, SeekOrigin.Begin);

        MessageParser parser = new MessageParser();
        return (T)parser.ParseFrom(ms);
            //ProtoBuf.Serializer.Deserialize<T>(ms);
    }
}

但是行MessageParser parser = new MessageParser();给了我一个设计/编译时错误

  

MessageParser不包含包含0个aguments的构造函数

好奇,因为我知道proto3 documents告诉我相反的事情。

我想知道的是,使用proto3,我如何进行反序列化?

感谢您的时间。

注意,我的序列化代码是

public static byte[] ToByteArray<T>(this T o) where T : IMessage 
{
    if (o == null)
        return null;

    using (MemoryStream ms = new MemoryStream())
    {
        o.WriteTo(ms);
        return ms.ToArray();
    }
}

这是编译,但是不是吗?

1 个答案:

答案 0 :(得分:5)

对于反序列化编译时错误,documentation告诉您应该将Func<T>作为函数工厂传递给T的构造函数创建MessageParser<T>的实例}}

可能是() => new T()或更复杂的功能,具体取决于创建消息所需的内容。

完整代码:

public static T ToObject<T>(this byte[] buf) where T : IMessage<T>, new()
{
    if (buf == null)
        return default(T);

    using (MemoryStream ms = new MemoryStream())
    {
        ms.Write(buf, 0, buf.Length);
        ms.Seek(0, SeekOrigin.Begin);

        MessageParser<T> parser = new MessageParser<T>(() => new T());
        return parser.ParseFrom(ms);
    }
}

正如documentation所说序列化应该没问题。