如何正确地从WCF DatacontractSerializer迁移到Protobuf-net

本文关键字:迁移 Protobuf-net DatacontractSerializer WCF 正确地 | 更新日期: 2023-09-27 18:04:50

我们有一个包含大量类的大型应用程序。我们目前正在用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上,我只能访问ProtobufProtobuf.Meta名称空间。

[编辑]我找到了一种方法来交换序列化器运行时:自定义WCF DataContractSerializer

上面的解决方案使用DataContractSerializerOperationBehavior。Protobuf-net提供这样的行为吗?

如何正确地从WCF DatacontractSerializer迁移到Protobuf-net

老实说,我不熟悉monmotouch中可用的WCF选项;例如,它们在常规的。net和silverlight之间有很大的不同——我认为没有理由假设monotouch有在运行时交换序列化器的能力("完整的"。net有,至少在MS版本下)。这使得它很难做转换无声,因为我们不能从DataContractSerializer的控制。

因此,IMO最简单的选择是手动获取对数据的控制,并发送原始byte[] -如果monotouch可以这样做,理想情况下启用MTOM编码。然后,一旦你有了你的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 {...}

如果我在这里错过了意图,让我知道。

请注意,如果您愿意,也有方法可以在不更改/添加任何属性的情况下完成所有配置。