2

我在 protoBuf 中有一条名为“包”的消息,我将 .proto 文件生成到类中,目的是填充该“包”中的所有必填字段,它工作正常。现在,我有一个名为“包”的 protoBuf 消息实例,我想将其序列化为流,然后将其输出到文件。

                    byte[] data;
                    using (var ms = new MemoryStream())
                    {
                        Serializer.Serialize<repo_package.Package.Builder>(ms, package);
                        data = ms.ToArray();
                    }
                    string packageFilePath = Path.Combine("C:\\1", package.Name);
                    File.WriteAllBytes(packageFilePath, data);

问题是当我调用“Serializer”函数时出现错误,错误是

“只能处理数据合同类(以及此类列表/数组)”

这是为什么?如何将我的包(protobuf 消息)输出到文件?

谢谢,

猎户座。

4

1 回答 1

1

这看起来像图书馆的交叉;如果您的 DTO 是Package,则Package.Builder强烈建议您使用 Jon Skeetprotobuf-csharp-port实现中的代码生成工具。这很好,但是通过protobuf-csharp-portexpect 生成的代码将库一起使用protobuf-csharp-port,这可能意味着“使用WriteToDTO 实例上的方法”。

protobuf-net是同一个序列化协议的完全独立的实现;它有单独的代码生成工具(诚然,两者都涉及称为protogen和的工具可能会有点令人困惑protoc)。如果您使用 的protobuf-net版本protogen,它将输出与protobuf-net库一起使用的代码(为了完整性,protobuf-net通常使用代码优先,而不涉及文件,但完全支持.proto合约优先使用)。.proto

所以; 任何一个:

  • 坚持protobuf-csharp-port代码生成,并切换到protobuf-csharp-port运行时,或者:
  • 坚持protobuf-net运行时,并切换到protobuf-net代码生成
于 2013-05-01T14:32:42.640 回答