我已经.proto
使用 protobuf-csharp-port 运行时编写并编译了一些文件,并且我试图返回一个作为对 WCF 方法调用的响应。这是我的服务:
[ServiceContract]
public interface IService
{
[OperationContract]
IEnumerable<Protobuf.LogEntry> GetLogItems();
}
但这会失败,并显示无用的“服务器未提供有意义的回复”错误消息。
对另一个问题的回答表明,这可能是序列化程序爆炸而不提供错误消息,所以我尝试将合同更改为string
:
[OperationContract]
IEnumerable<string> GetLogItems();
这很好用,所以它一定与 Protobuf 有关。
我的假设是 WCF 由于某种原因无法序列化 Protobuf。我见过很多人在写[DataContract]
,但这似乎只与 相关protobuf-net
,但我找不到任何关于 的信息protobuf-csharp-port
,这似乎并没有以[DataContract]
完全相同的方式使用。我尝试将-code_contracts
Protogen 的选项设置为,true
但这并不能解决任何问题(它甚至可能不相关)。
那么:如何从 WCF 方法调用中返回 Protobuf 对象?显然我可以手动反序列化 Protobufs,但这会变得乏味,所以我希望 WCF 为我做这件事。
请注意,我并不是想用 Protobuf替换WCF 序列化;我只想从 WCF 方法调用中返回一个 Protobuf 对象。
编辑#1:我DataContractSerializer
手动设置了一个并尝试序列化一个 Protobuf。我收到一个错误,上面写着Type 'Protobuf.LogEntry' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMember attribute.
很明显,我不能这样做,因为代码是自动生成的。那么:如何使用 ProtoGen 或其他方式添加适当的属性?