我试图在方法中传递MyData的对象(实际引用)但是获得异常 . 通道类型是NetTcpBinding .
System.ServiceModel.CommunicationException:尝试序列化参数http://tempuri.org/:myData时出错 . InnerException消息是'Type'System.RuntimeType',数据协定名称为'RuntimeType:http://schemas.datacontract.org/2004/07/System'不是预期的 . 考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中 . 有关更多详细信息,请参阅InnerException . ---> System.Runtime.Serialization.SerializationException:不要求输入数据为'RuntimeType:http://schemas.datacontract.org/2004/07/System'的'System.RuntimeType' . 考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中 .
[DataContract]
[KnownType(typeof(System.Type))] //Keeping it here or removing does not make any difference
public class MyData
{
private Type m_MyType = typeof(string);
[DataMember]
public Type MyType //WCF does not like this. If removed of data type changed then ok
{
get { return m_MyType; }
set { m_MyType = value; }
}
private Int32 m_Member1 = 0;
[DataMember]
public Int32 Member1
{
get { return m_Member1; }
set { m_Member1 = value; }
}
}
2 回答
This是您不应该从WCF操作返回Type的一个原因 .
我建议你返回Type.AssemblyFullyQualifiedName而不是Type . 然后在呼叫端你可以:
如果要使用Type创建新对象等 .
一种解决方案,即使它可能不是最好的(这种解决方案更通用,并且可以允许您使用任何二进制可序列化对象),可以手动序列化您的类,通过WCF发送byte []并在其上反序列化它接待:
这是反序列化:
这里是我用来手动充电dll以解决自定义类型问题的程序集解析器(你可以猜到,DllPaths是一个包含我可能必须使用的dll路径的列表):
我希望它可以帮助你!