C# 将protoBuf网络消息序列化到流c“getting error”;“只能处理数据协定类”;
protoBuf中有一条消息称为“package”,我将.proto文件生成到类中,目的是填充“package”中所有必需的字段,它工作正常。 现在,我有一个名为“package”的protoBuf消息实例,我想将其序列化为一个流,然后将其输出到一个文件C# 将protoBuf网络消息序列化到流c“getting error”;“只能处理数据协定类”;,c#,serialization,protocol-buffers,protobuf-net,C#,Serialization,Protocol Buffers,Protobuf Net,protoBuf中有一条消息称为“package”,我将.proto文件生成到类中,目的是填充“package”中所有必需的字段,它工作正常。 现在,我有一个名为“package”的protoBuf消息实例,我想将其序列化为一个流,然后将其输出到一个文件 byte[] data; using (var ms = new MemoryStream()) {
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);
byte[]数据;
使用(var ms=new MemoryStream())
{
序列化器。序列化(ms,包);
data=ms.ToArray();
}
字符串packageFilePath=Path.Combine(“C:\\1”,package.Name);
File.writealBytes(packageFilePath,数据);
问题是我调用“Serializer”函数时出错,错误是
“只能处理数据协定类(及其列表/数组)”
为什么呢?
如何将包(protobuf消息)输出到文件
谢谢,
猎户座。这看起来像是图书馆的交叉;如果您的DTO是
Package
,则Package.Builder
的存在强烈表明您正在使用Jon Skeet的protobuf csharp端口
实现中的代码生成工具。这很好,但是通过protobuf csharp端口
生成的代码预计将与protobuf csharp端口
库一起使用,这可能意味着“在DTO实例上使用WriteTo
方法”
protobuf-net
是同一序列化协议的一个完全独立的实现;它有单独的代码生成工具(无可否认,两者都涉及称为protogen
和protoc
的工具,这可能会有点混淆)。如果使用protobuf-net
版本的protogen
,它将输出与protobuf-net
库一起工作的代码(为了完整性,对于protobuf-net
来说,通常先使用代码,而不涉及.proto
文件,但完全支持合同优先.proto
使用)
因此,要么:
- 坚持使用
代码生成,然后切换到protobuf csharp端口
运行时,或者:protobuf csharp端口
- 坚持使用
运行时,并切换到protobuf-net
代码生成protobuf-net
Builder
?请注意,除了@jsobo的评论之外,还有其他不需要属性的方法来配置模型,但关键是您需要以某种方式配置系统。最简单的方法是属性,但您也可以使用运行时代码告诉它您希望它做什么@jsobo我需要在哪里添加装饰?@Marc_Gravell,从.proto文件生成的.cs文件很大,并且不是所有的代码都是可以理解的。@Orionlk right;您有一个从.proto生成的文件-这是一个很好的开始。现在:您使用了什么工具来生成代码?如果它是protobuf net工具,那么它应该可以工作。我会非常高兴有兴趣知道它不是。那么:你用什么把.proto转换成.cs?我怀疑你可能使用了Jon实现中的工具,但是我的库。谢谢@Marc_Gravell,我理解我的错误,我坚持使用protobuf网络实例和函数,现在它工作得很好。