我更新了现有的 WCF 应用程序以添加 protobuf-net 支持。基本上,我有:
在包含我所有数据对象的程序集中添加了 protobuf-net.dll (.net 3.0) 作为引用。我的服务器和客户端都引用了这个程序集
将 [DataMember] 替换为 [DataMember(Order = x)] (使用递增的整数作为 x)
使用 ProtoBehavior 属性更新了我的所有 OperationContracts
更新了我的服务参考
从客户端,我在服务器上调用此方法:
[OperationContract(IsOneWay = false), ProtoBehavior]
ConnectionData Join(string userId, string Password);
ConnectionData 的定义如下:
[DataContract]
public class ConnectionData
{
[DataMember(Order = 1)]
public ConnectionStatusEnum ConnectionStatus; // this is a normal enum with five elements
// .....
[DataMember(Order = 5)]
public bool MustChangePassword;
}
现在,这是发生了什么:
如果我调试服务器,我会看到 ConnectionData 对象已正确初始化并在 Join 方法中返回
如果我调试客户端,我会看到我的 Join 调用返回了一个空对象
我已将 WCF 跟踪启用到最大详细程度,在服务器日志中没有引起我的注意,但在客户端日志文件中我看到了以下警告消息:
System.Runtime.Serialization.ElementIgnored
在反序列化期间在 XML 中遇到无法识别的元素,该元素被忽略。
元素 http://tempuri.org/:proto
我已经嗅探了我的网络流量,我不怪 protobuf-net 无法反序列化:
<s:Body><JoinResponse xmlns="http://tempuri.org/"><proto/></JoinResponse></s:Body>
如何进一步解决问题并让 protobuf-net 正确序列化我的消息?
我正在使用 protobuf-net r275