首页 新闻 会员 周边 捐助

WCF 序列化 Type对象

0
悬赏园豆:100 [已解决问题] 解决于 2010-04-28 17:32

现在我有一个方法:

public object Fetch(Type objectType){}

这个方法调用一个WCF的方法,并且把objectType作为参数传进去,

因为WCF不能很好的序列化Type类型,所以每次都是报错:

Type 'System.RuntimeType' with data contract name 'RuntimeType:http://schemas.datacontract.org/2004/07/System' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

希望大家帮忙?怎么解决

问题补充: 请给出具体的方案 有代码的, 再次感谢
小洋(燕洋天)的主页 小洋(燕洋天) | 菜鸟二级 | 园豆:206
提问于:2010-04-27 13:38
< >
分享
最佳答案
0

需要在配置文件配置 known types,或者使用属性标记。

在你的 wcf 契约中肯定有一个客户端、服务端均明确已知的序列化类型,当这个已知类型包含某一方未“申明”的类型时,就会抛出你看到的错误。

在 app.config 中加入类似如下节点(给每个已知类型增加未知类型的申明,我是这么理解的):

<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<!--服务端返回类型-->
<add type="Mis.Wcf.WcfServiceResult,Mis">
<knownType type="Download.Models.DownloadQuery[],Download.Models"/>
<knownType type="System.String[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</add>
<!--客户端提交类型-->
<add type="Mis.Wcf.WcfServiceParameters,Mis">
<knownType type="Download.Models.DownloadResult,Download.Models"/>
<knownType type="System.String[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>

 

 

收获园豆:60
陛下 | 老鸟四级 |园豆:3938 | 2010-04-27 13:48
ok,我试试,谢谢啊
小洋(燕洋天) | 园豆:206 (菜鸟二级) | 2010-04-27 13:51
不行啊,我现在只是想从客户端传Type, <system.runtime.serialization> <dataContractSerializer> <declaredTypes> <!--服务端返回类型--> <!--客户端提交类型--> <add type="System.Type,mscorlib"> <knownType type="System.Type, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </add> </declaredTypes> </dataContractSerializer> </system.runtime.serialization> 还是不行
小洋(燕洋天) | 园豆:206 (菜鸟二级) | 2010-04-27 15:30
其他回答(1)
1

Server

代码
public string GetContentTypeName(byte[] type)
{
//创建内存流
MemoryStream ms = new MemoryStream(type);

//ms.Write(type, 0, type.Length);
BinaryFormatter bf = new BinaryFormatter();
//将内存流中的数据反序列化为type对象
var typeObj = bf.Deserialize(ms) as Type;
//返回type对象的类型名称
return typeObj.FullName;
}

 

Client

 

代码
//创建type对象
var typeObj = typeof(String);

//创建内存流
MemoryStream ms = new MemoryStream();
//创建二进制序列化器
BinaryFormatter bf = new BinaryFormatter();
//序列化对象到内存流
bf.Serialize(ms, typeObj);

var bytes
= ms.ToArray();
ms.Close();

//创建服务客户端
ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();
//调用GetContentTypeName完成type对象字节流传输,并获取服务端发回的类型名称
var typeFullName = client.GetContentTypeName(bytes);

 

 

收获园豆:40
heros | 园豆:761 (小虾三级) | 2010-04-27 22:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册