![](/img/trans.png)
[英]Performance of protobuf-net vs DataContractSerializer over WCF
[英]How to properly migrate from WCF DatacontractSerializer to Protobuf-net?
我们有很多类的庞大应用程序。 我们目前正在使用Monotouch将此.net应用程序移植到IPad。 我们在使用DataContractSerializer时遇到了一些问题,我们想使用Marc Gravell的protobuf-net序列化器。
客户端和服务器之间的通信由WCF服务管理。
WCF服务由暴露给客户端和服务器的一个接口以及服务器上此接口的一个实现组成。
界面看起来像这样:
[ServiceContract]
public interface IMyService
{
[OperationContract]
SomeObject MyFunction(SomeObject myObject);
}
服务器端实现看起来像这样:
[ServiceBehavior(...)]
public class MyService
{
public SomeObject MyFunction(SomeObject myObject)
{
}
}
我们的课程看起来像这样:
[DataContract]
public class MyClass
{
[DataMember]
public int SomeProp {get; set;}
[OnSerialized]
public void OnSerialized(StreamingContext context)
{
}
}
所以这是我的问题:
对我的类,wcf接口和wcf实现做什么改动。
如何将默认WCF DataContractSerializer替换为Protobuf Serializer。
请注意,在monotouch上,我只能访问Protobuf
和Protobuf.Meta
名称空间。
[编辑]我找到了一种交换序列化器运行时的方法: 自定义WCF DataContractSerializer
上述解决方案使用DataContractSerializerOperationBehavior。 Protobuf-net是否提供此类行为?
说实话,我不熟悉monmotouch中可用的WCF选项; 例如,它们在常规.NET和Silvelight之间是非常不同的 - 我认为没有理由认为monotouch能够在运行时交换序列化程序(至少在MS版本下,“完全”.NET会这样做)。 这使得很难以静默方式进行转换,因为我们无法从DataContractSerializer
进行控制。
因此,IMO最简单的选择是手动控制数据,并发送原始byte[]
- 理想情况下启用MTOM编码,如果monotouch可以做到这一点。 然后,一旦你有了你的byte[]
,就像他们所说的那样,世界就是你的软体动物。
重新改变你的类型......好吧, MyFunction()
是一个奇怪的,因为它不传输任何数据,所以我不确定你希望我在那个上建议什么。 使用MyClass
,它所需要的只是每个成员的唯一编号(在类型中是唯一的,而不是全局的),即
[DataContract]
public class MyClass
{
[DataMember(Order=1)] // <==== this provides the 1 as the key
public int SomeProp {get; set;}
// see below re callback
}
你还有一个序列化回调; 这些是完全支持的,但它希望找到一个熟悉的模式 - StreamContext
不是我所知道的(尽管它应该与StreamingContext
和其他一些一起使用)。
最后,请注意默认情况下 protobuf-net执行构造函数,这与DataContractSerializer
不同。 如果您愿意,可以通过以下方式抑制此问题:
[DataContract(SkipConstructor=true)]
public class MyClass {...}
如果我错过了这里的意图,请告诉我。
请注意,如果您愿意,还可以在不更改/添加任何属性的情况下执行所有配置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.