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

Jea*_*erc 5 c# wcf serialization protobuf-net

我们有很多类的庞大应用程序.我们目前正在使用Monotouch将此.net应用程序移植到IPad.我们在使用DataContractSerializer时遇到了一些问题,我们想使用Marc Gravell的protobuf-net序列化器.

客户端和服务器之间的通信由WCF服务管理.

WCF服务由暴露给客户端和服务器的一个接口以及服务器上此接口的一个实现组成.

界面看起来像这样:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    SomeObject MyFunction(SomeObject myObject);
}
Run Code Online (Sandbox Code Playgroud)

服务器端实现看起来像这样:

[ServiceBehavior(...)]
public class MyService
{
    public SomeObject MyFunction(SomeObject myObject)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的课程看起来像这样:

[DataContract]
public class MyClass
{
    [DataMember]
    public int SomeProp {get; set;}

    [OnSerialized]
    public void OnSerialized(StreamingContext context)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

所以这是我的问题:

  • 对我的类,wcf接口和wcf实现做什么改动.

  • 如何将默认WCF DataContractSerializer替换为Protobuf Serializer.

请注意,在monotouch上,我只能访问ProtobufProtobuf.Meta命名空间.

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

上述解决方案使用DataContractSerializerOperationBehavior.Protobuf-net是否提供此类行为?

Mar*_*ell 2

老实说,我不熟悉 monmotouch 中可用的 WCF 选项;例如,它们在常规 .NET 和 Silvelight 之间非常不同 - 我认为没有理由假设 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
}
Run Code Online (Sandbox Code Playgroud)

您还有一个序列化回调;这些都是完全支持的,但它期望找到一种熟悉的模式 -StreamContext不是我所知道的模式(尽管它应该与StreamingContext其他一些模式一起使用)。

最后,请注意,默认情况下protobuf-net 执行构造函数,这与DataContractSerializer. 如果您愿意,可以通过以下方式抑制此行为:

[DataContract(SkipConstructor=true)]
public class MyClass {...}
Run Code Online (Sandbox Code Playgroud)

如果我错过了这里的意图,请告诉我。

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