问题描述
我建立的服务器端和用户端通过WCF实现接口调用,简单说来是传递一个自定义类对象,当然大家会想到序列化,我选用的是BinaryFormatter+MemoryStream,但不管是流类型传递还是转换为byte[]传递都会出现问题(如果各位大神对问题的种类感兴趣我可以给大家截图),我想请教大神们的是:1、基于BinaryFormatter应该选用什么流类型?2、除了Http传输以及Socket传输之外,用纯粹的WCF接口调用怎么远程传递一个自定义对象?IDE是VS2010,语言C#。下面是关于序列化(客户端)、反序列化(服务器端)的部分代码,其中实验类User里仅有数据成员。客户端:Useru=newUser();//自定义类/*对类进行操作*/IFormatterb=newBinaryFormatter();MemoryStreamms=newMemoryStream();b.Serialize(ms,u);intresult=wcfserver.getProfile(ms.GetBuffer());//服务器端函数服务器端:publicintgetProfile(byte[]bytes){Useru=newUser();MemoryStreamms=newMemoryStream(bytes);IFormatterb=newBinaryFormatter();u=(User)b.Deserialize(ms);/*剩余操作*/
解决方案
本帖最后由 clegendc 于 2011-12-06 10:27:58 编辑
解决方案二:
我调用WCF服务的时候没有用系列化,我用的是异步传输,在COMPLETE事件通过遍历获取数据在客户端专门有个对象来接数据我用的是LIST来接的。你如果在客户端用User类的话,应该用Serivicereference1.User而不是直接用User。
解决方案三:
不好意思我是个WCF新手,问一下如何实现客户端对服务器端类的引用,ServiceReference1对远端自定义类不可见怎么办?
解决方案四:
你在调用服务的时候第一步不是添加服务引用吗?添加过后,默认服务名就叫做ServiceReference1以下是我异步方法里面事件1.在load()事件里面声明ServiceReference1.Service1Clientsc=newServiceReference1.Service1Client();sc.JQHotSpotCompleted+=newEventHandler<ServiceReference1.JQHotSpotCompletedEventArgs>(sc_JQHotSpotCompleted);2.在Completed事件里面调用voidsc_JQHotSpotCompleted(objectsender,ServiceReference1.JQHotSpotCompletedEventArgse){List<Hot>lst=newList<Hot>();doubleeast,west,south,north;foreach(ServiceReference1.HotSpotsine.Result){QuadTree.Quadtree2Geodetic(s.QTREE.ToString(),outeast,outsouth,outwest,outnorth);Hoth=newHot();h.X=(west+east)/2;h.Y=(north+south)/2;h.Weight=Convert.ToDouble(s.NUM);lst.Add(h);}this.hotspot.ISQuickSearch=true;this.hotspot.ItemSource=lst;this.hotspot.Bind();}
解决方案五:
没错,ServiceReference1确实实现了远端定义的一些方法,但我是想引用远端定义的类(其实跟结构体没什么区别,纯数据包而已),请问怎么实现这个服务器端自定义类的客户端引用呢?
解决方案六:
ServiceReference1.类名,我上面的Complete事件中ServiceReference1.HotSpot就是引用服务器端的类。这样就保持一致了
解决方案七:
我换了种更cuo的方式:本来想在IService1.cs文件里的[DataContract]域添加自定义类User,但是UpdateServiceReference之后在ObjectBrowser->Client->{}Client.ServiceReference1里找不到User,之后我果断在默认的CompositeType类里添加了自己需要的属性、方法,这样才最终实现了远程调用...请问:是否可以在IService1.cs文件里定义多个[DataContract](数据契约)类?除了重写CompositeType类之外还有别的方法引用自定义类吗?
解决方案八:
[DataContract]定义借口要和你方法一致,多少个无所谓,数据模型你可以建一个工程专门存放。服务端引用,客户端调用就和那个工程基本没什么关系了,你需要用的数据模型就是服务器端的。而不是那个工程的了。