将protoBuf-net消息序列化为流c# - 获取错误“只能处理数据合同类”

时间:2013-05-01 11:51:26

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

我在protoBuf中有一个叫做“package”的消息,我生成了我的.proto文件,用于填充该“package”中的所有必填字段,并且工作正常。 现在,我有一个名为“package”的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消息)输出到文件?

谢谢,

猎户。

1 个答案:

答案 0 :(得分:1)

这看起来像一个图书馆交叉;如果你的DTO是Package,那么Package.Builder的存在强烈暗示你正在使用Jon Skeet的protobuf-csharp-port实现中的代码生成工具。这很好,但是通过protobuf-csharp-port生成的代码期望与 {/ 1}}库一起使用,这可能意味着“在DTO实例上使用protobuf-csharp-port方法”

WriteTo是相同序列化协议的完全独立的实现;它有单独的代码生成工具(不可否认,它们可能有点令人困惑,它们都涉及名为protobuf-netprotogen的工具。如果您使用protocprotobuf-net,则会输出与protogen库一起使用的代码(为了完整性,protobuf-net使用代码优先,不涉及protobuf-net文件,但完全支持合同优先.proto使用。)

因此;之一:

  • 坚持.proto代码生成,并切换到protobuf-csharp-port运行时,或者:
  • 坚持protobuf-csharp-port运行时,并切换到protobuf-net代码生成