WCF传输实体!!!!!!!!!!!!!!!!!!!!!!!!!!!

js1722 2009-03-13 09:18:52
目的是将客户端的泛型实体转为List<object>,传输到WCF服务端,再由WCF服务端对List<object>里的每个object对象进行序列化操作,然后存入数据库. 但是在WCF服务端进行序列化操作时,报错.. 客户端的实体对象都加了DataContract字段也加了DataMember. 错误提示为:进行序列化时出错:消息是数据协定名称"****"不是所需的类型.请将未知的类型以静态方式添加到已知类型的列表. 有遇到过这种情况吗?
...全文
1204 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycsno1 2009-03-14
  • 打赏
  • 举报
回复
一般这种情况应该是有两种解决办法,
1.把实体放到服务器端,在客户端引用就可以了!(我不知道这样是否会对楼主的客户端程序有影响!)
2.实体在服务器有,在客户端也有,需要用的时候写方法自己转换一下!
不同情况用不同方法,看楼主的具体需求了!
hubofly 2009-03-14
  • 打赏
  • 举报
回复
List 好像是有问题的
我用wcf的时候 用的是IEnumerable来传输的
例如
[DataMember]
public IEnumerable<object> array;
object 为制定类型的对象,我一般传输的时候都是确定object的对象类型的

然后就是一个数组对象了,基本没遇到过
js1722 2009-03-13
  • 打赏
  • 举报
回复
OK. 我工作不能用QQ,你加我的MSN或SKYPE吧~ 我的MSN:jiangsun_@hotmail.com skype:jiangsun210
js1722 2009-03-13
  • 打赏
  • 举报
回复
OK. 我工作不能用QQ,你加我的MSN或SKYPE吧~ 我的MSN:jiangsun_@hotmail.com skype:jiangsun210
  • 打赏
  • 举报
回复
DataContractSerializer ,它有?

最近准备学些下silverlight,呵呵,有机会多交流,我的qq:261882714
js1722 2009-03-13
  • 打赏
  • 举报
回复
它的客户端只装2,3MB的文件就可以运行了。
js1722 2009-03-13
  • 打赏
  • 举报
回复
它的客户端只装2,3MB的文件就可以运行了。
js1722 2009-03-13
  • 打赏
  • 举报
回复
诶~ 不行的. . 好象就它SDK包里面那些,毕竟现在还没出正式版.
  • 打赏
  • 举报
回复
那么说它的客户端环境还是支持v.net的dll的了,那就无所谓支持的组件少了,反正少什么就直接添加dll引用不就可以了,嘿嘿。
js1722 2009-03-13
  • 打赏
  • 举报
回复
DataContractSerializer ..
silverlight里面支持的组件还是太少了,
  • 打赏
  • 举报
回复
呵呵,用什么序列化的?
js1722 2009-03-13
  • 打赏
  • 举报
回复
OK. 传普通的实体对象已经搞定了,再客户端序列化了再传递过去。 silverlight和WCF,连List<>都不通用. 再研究下怎么把控件序列化.
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 js1722 的回复:]
客户端是用silverlight做的,在这里面没有找到序列化的相关程序集,再仔细研究下...
[/Quote]

呵呵,难道你在程序里易用system.servicemodel.dll不能用?这个只不过是一个dll罢了,里面的序列化类并不依赖具体的环境的

对于silverlight还在了解阶段,是不是引用了这个dll,它在客户端的环境会不支持,或者无法对这个dll不能打包?
vrhero 2009-03-13
  • 打赏
  • 举报
回复
既然协定是由服务端定义的...ServiceKnownType类型当然是必须在服务端声明的...

客户端是不需要声明实体类型的,客户端类型是根据服务端类型生成的...
js1722 2009-03-13
  • 打赏
  • 举报
回复
客户端是用silverlight做的,在这里面没有找到序列化的相关程序集,再仔细研究下...
  • 打赏
  • 举报
回复
呵呵,以前也做过类似的
如果你的所有实体都被标注了datacontract,和datamember

建议你可以自己预先序列化成字符串,然后你的wcf通讯接口只有一个方法,就是传递你序列化的字符串,然后在服务端反序列化回来。因为如果你传一个明确的对象,它也是要去做序列化的,你如果自己做 了,它就不会去做了。用Datacontractserilizer,它就是用的这个,这个只要你标注了datacontract和datamember速度是非常快,也不怎么耗cpu。
js1722 2009-03-13
  • 打赏
  • 举报
回复
谢谢楼上二位. 我的实体是放在客户端的,刚测了一下,添加了[KnownType(typeof(**))]属性. 还是不行. 是否需要把实体加在服务端申明呢?
但是客户端很多地方都用到了此实体.
WizardWu 2009-03-13
  • 打赏
  • 举报
回复
Web Service,有时候为了图方便,会想要直接传递 object 类型的变量回到前端,是可以成功的,不过在 WCF 中,由于它要求所有在 WCF 数据流中通讯的对象数据都必须要有一个明确的类型,以利 WCF 的序列化与反序列化用,因此它无法传递 object 这种未知类型的对象,所以 WCF 在预设情况下,只能够传递由数据合约 (Data Contract) 所描述的对象 (此即已知类型问题,是一种由开发团队所设计的行为)。
不过,如果你认定该 object 代表的类型的话,你就必须要在数据合约中加上 KnownTypeAttribute 宣告,让 WCF 的序列化引擎可以把 KnownTypeAttribute 所定义的型别当做 object 的默认类型,如此就可以在资料合约中使用 object 类型的数据了。

[DataContract]
[KnownType(typeof(UserAccount))]
public class Response
{

   [DataMember]
   public string ResponseText;

   [DataMember]
   public bool CompletedSuccesfully;

   [DataMember]
   public object ResponseObject;

}
vrhero 2009-03-13
  • 打赏
  • 举报
回复
所有传输的实体对象类型都必须是已知的...必须在协定中声明这些类型...

用ServiceKnownType属性声明...

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧