gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:41:24 26 4
gpt4 key购买 nike

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

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

WCF 服务由一个暴露给客户端和服务器的接口(interface),以及该接口(interface)在服务器上的一个实现组成。

界面是这样的:

[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 接口(interface)和 wcf 实现需要做哪些更改。

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

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

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

上述解决方案使用 DataContractSerializerOperationBehavior。 Protobuf-net 是否提供这种行为?

最佳答案

老实说,我不熟悉 monmotouch 中可用的 WCF 选项;它们在常规 .NET 和 Silvelight 之间非常不同,例如 - 我认为没有理由假设 monotuch 有能力在运行时交换序列化程序(“完整”.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 {...}

如果我没有理解这里的意图,请告诉我。

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

关于c# - 如何正确地从 WCF DatacontractSerializer 迁移到 Protobuf-net?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6958009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com