Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF推荐序列化多个对象的方法_C#_.net_Wcf_Serialization - Fatal编程技术网

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

C# WCF推荐序列化多个对象的方法,c#,.net,wcf,serialization,C#,.net,Wcf,Serialization,我正试图围绕一个可能的瓶颈进行优化 我有一个服务器应用程序,它远程为从数据库到应用程序的对象提供服务,它可以处理1-n个不同类型的1-n对象(其中n可以是一个相对较高的数字),这些对象都实现了一个公共接口,但可能在不同类型上包含许多独特的属性 客户机应用程序将服务器对象存储在本地缓存中,直到它们准备好通过服务器将它们保留回数据库 这是目前在WCF中完成的,每个类定义一个DataContract 由于可能需要将大量对象传递回服务器(根据实现的不同而有所不同),我不希望再将所有这些对象都作为单独的调

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

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

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

这是目前在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 {...}}
}
[DataContract]
公共类包装器{
[数据成员(顺序=1)]
公共列表Foos{get{…}
[数据成员(顺序=2)]
公共列表栏{get{…}
[数据成员(顺序=3)]
公共列表Blops{get{…}
}
然后,您应该能够发送包含任意数量的
Foo
Bar
和/或
Blop
记录的单个消息。我包含的命令>代码>属性是故意的——如果你想减少流的大小,你可以考虑——在上面的布局中,OptoBuffnet可以简单地通过在你想要攻击的方法(在客户机和服务器上)(包括在操作契约接口)中包含<代码> [原型行为] < /代码>来钩住WCF。这将转换为使用谷歌的“协议缓冲区”二进制格式,使用base-64进行编码。如果您使用的是基本http绑定,那么如果启用,也可以使用MTOM,因此即使是base-64也不是问题。使用这个,你可以得到(根据显示的数字,大约是空间的五分之一)

(编辑1-protobuf net假定
Foo
Bar
Blop
也使用
Order
属性)


(编辑2-请注意,您总是可以将请求分解为许多中等大小的
包装
消息,然后在服务器上(可能在数据库的暂存表中)调用一个方法来应用所有更改)

谢谢您的Marc,总是有一些思想食粮,其他选项可用,您的里程可能会有所不同-P