代码之家  ›  专栏  ›  技术社区  ›  johnc

WCF推荐序列化多个对象的方法

  •  2
  • johnc  · 技术社区  · 16 年前

    我正试图围绕一个可能的瓶颈进行优化。

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

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

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

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

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

    1 回复  |  直到 16 年前
        1
  •  3
  •   Marc Gravell    16 年前

    “相对高”有多高?

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

    [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 {...}}
    }
    

    然后,您应该能够发送一条包含任意数量 Foo , Bar 和/或 Blop Order 属性是故意的——如果你想减少流的大小,你可以考虑 protobuf-net -通过上述布局,protobuf网络只需包含 [ProtoBehavior] 在要攻击的方法(在操作契约界面中)(在客户端和服务器上)上。这将转换为使用谷歌的“协议缓冲区”二进制格式,使用base-64进行编码。如果您使用的是基本http绑定,那么如果启用,也可以使用MTOM,因此即使是base-64也不是问题。使用这个,你可以 significant data transfer savings (约为所示数字的1/5)。

    , 酒吧 水滴 而且 使用 顺序 属性)

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