2009-02-12 49 views
2

我试图围绕可能的瓶颈进行优化。WCF推荐用于序列化多个对象的方法

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

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

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

由于可能需要传回服务器的对象数量可能很大(它根据实施情况而变化),所以我宁愿不要将这些全部作为单独的调用进行,而是将所有对象都包含在内一个单一的序列化(或更好的压缩)流,并将它们作为一个连接发送到服务器。

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

回答

3

“相对较高”有多高?发生

例如,一种选择是使用包装对象:

[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可以挂钩到WCF,只需在方法中包含[ProtoBehavior](在操作契约界面),你想要攻击(在客户端和服务器端)。这将转换使用谷歌的“协议缓冲区”二进制格式,使用base-64进行编码。如果您使用的是基本http绑定,那么如果启用了此功能,也可以使用MTOM,因此即使base-64也不是问题。使用这个,你可以得到significant data transfer savings(根据显示的数字〜1/5的空间)。

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

(编辑2 - 注意,你总是可以打破请求成若干中等规模的Wrapper消息,然后调用一个方法来应用所有的更改,一旦你有他们在服务器(大概是在数据库中的临时表))

+0

感谢您的Marc,一些思考的食物 – johnc 2009-02-12 11:25:19