gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:16:22 25 4
gpt4 key购买 nike

我最近升级了我的代码库(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 does not contain a constructor that contains 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();
}
}

这可以编译,但是正确吗?

最佳答案

对于反序列化编译时错误,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说序列化应该没问题。

关于C# Google.ProtocolBuffers 反序列化方法 (proto3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35336559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com