【问题标题】:C# Google.ProtocolBuffers Deserialization Method (proto3)C# Google.ProtocolBuffers 反序列化方法(proto3)
【发布时间】:2016-02-11 10:20:57
【问题描述】:

我最近升级了我的代码库(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 个参数的构造函数

这很奇怪,因为我知道 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();
    }
}

这样可以编译,但是对吗?

【问题讨论】:

    标签: c# deserialization protocol-buffers proto3


    【解决方案1】:

    对于您的反序列化编译时错误,documentation 告诉 您应该将Func&lt;T&gt; 作为函数工厂来创建T 的实例到MessageParser&lt;T&gt; 的构造函数

    它可以是 () =&gt; 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 所说,序列化应该没问题。

    【讨论】:

    • 嗨,我完全错过了文档的那一部分。我一定是暂时失明了!我已经调整了你的代码以便它编译。有两件事是错误的。 1、IMessage在没有指定T类型的情况下无法装箱/拆箱。 2. 需要new() 约束以便能够“新建”T。感谢您的宝贵时间...
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2013-10-12
    • 2011-05-12
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多