gpt4 book ai didi

c# - WCF Recommend 序列化多个对象的方法

转载 作者:行者123 更新时间:2023-11-30 22:50:30 25 4
gpt4 key购买 nike

我正在尝试围绕可能的瓶颈进行优化。

我有一个服务器应用程序,它为从数据库到远程应用程序的对象提供服务,它可以处理 1-n 个不同类型的 1-n 个对象(其中 n 可以是一个相对较大的数字),它们都实现了一个通用接口(interface)但可能包含不同类型的许多独特属性。

客户端应用程序将服务器对象存储在本地缓存中,直到它们准备好通过服务器将它们持久保存回数据库。

这是目前在 WCF 中完成的,每个类都定义了一个 DataContract。

由于可能需要将大量对象传回服务器(它会根据实现而变化),我不想再将这些全部作为单独的调用来执行,而是将所有对象包装在一个单个序列化(或更好的压缩)流并将它们作为一个连接发送到服务器。

我可以很简单地推出自己的方法,但更愿意使用推荐的方法,并希望有人可以提出建议。如果你能说服我,我也愿意接受我的方法可能不是最好的主意。

最佳答案

“相对高”有多高?

例如,出现的一个选项是使用包装器对象:

[DataContract]
public class Wrapper {
[DataMember(Order = 1)]
public List<Foo> Foos {get {...}}

[DataMember(Order = 2)]
public List<Bar> Bars {get {...}}

[DataMember(Order = 3)]
public List<Blop> Blops {get {...}}
}

那么您应该能够发送包含任意数量的 FooBar 和/或 Blop 记录的单个消息。我故意包含 Order 属性 - 如果您想减小流的大小,您可以考虑 protobuf-net - 通过上面的布局,protobuf-net 可以简单地通过在您想要攻击的方法(在操作契约(Contract)接口(interface)中)上包含 [ProtoBehavior] 来 Hook WCF(在客户端和服务器上)。这会将传输切换为使用 google 的“ Protocol Buffer ”二进制格式,使用 base-64 进行编码。如果您使用的是 basic-http 绑定(bind),如果启用,这也可以使用 MTOM,因此即使是 base-64 也不是问题。使用这个,你可以得到 significant data transfer savings (根据显示的数字,空间约为 1/5)。

(编辑 1 - protobuf-net 假定 FooBarBlop 使用Order 属性)

(编辑 2 - 请注意,您始终可以将请求分解为多个中等大小的 Wrapper 消息,然后在服务器上调用一个方法来应用所有更改(大概在数据库的临时表中))

关于c# - WCF Recommend 序列化多个对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/540340/

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