我已更新现有的WCF应用程序以添加protobuf-net支持。 基本上,我:
在包含我所有数据对象的程序集中添加了protobuf-net.dll(.net 3.0)作为引用。我的服务器和客户端都引用了这个程序集
用[DataMember(Order = x)]替换[DataMember](使用增加的整数作为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调用返回的null对象
我已将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
答案 0 :(得分:0)
抱歉延迟 - 工作时间等等。双方都知道这个变化吗?不幸的是,WCF集成在客户端与“mex”生成的代理不能很好地协作,但在汇编共享时可以正常工作。
或者,正在进行一些工作以使用可在配置中指定的端点行为;这不是100%,但应该很快 - 并且允许WCF透明地使用protobuf-net,而不会对服务合同产生任何影响(尽管成员仍需要通过[ProtoMember(n)]
等了解它,或[DataMember(Order=n)]
。
答案 1 :(得分:0)
我在这方面做了一些工作,我怀疑问题是你有服务引用(通过IDE或通过svcutil),即使是 它重新使用共享数据契约,导致契约接口被复制(并丢失行为属性,使其破坏)。
选项:
ClientBase<T>
)如果您不熟悉它们,我计划在接下来的几天内为第一个选项撰写博客条目。