现在我有一个方法:
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.
希望大家帮忙?怎么解决
需要在配置文件配置 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>
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);