您好我有以下类层次结构:
public class SuperJob{
}
public class JobA:SuperJob{
}
public class JobB:SuperJob{
}
当我尝试反序列化SuperJob时,我得到了
Expecting element 'SuperJob' from namespace 'http://schemas.datacontract.org/2004/07/...'.. Encountered 'Element' with name 'JobA', namespace 'http://schemas.datacontract.org/2004/07/...'.
我注释了我的课程如下:
[DataContract]
[KnownType(typeof(JobA))]
[KnownType(typeof(JobB))]
public class SuperJob{
}
[DataContract]
public class JobA:SuperJob{
}
[DataContract]
public class JobB:SuperJob{
}
不确定我做错了什么?任何想法如何解决这个问题?
答案 0 :(得分:0)
在您的服务上使用[ServiceKnownType]属性:
[ServiceKnownType(typeof(JobA))]
[ServiceKnownType(typeof(JobB))]
public interface IJobService
{
.... methods
}
Another approach would be to pass knowntypes in DataContractSerializer constructor.
List<Type> knownTypeList = new List<Type>();
knownTypeList.Add(typeof(JobA));
knownTypeList.Add(typeof(JobB));
// Create a DatatContractSerializer with the collection.
DataContractSerializer ser2 = new DataContractSerializer(
typeof(SuperJob), knownTypeList);
答案 1 :(得分:0)
管理以解决此问题,服务总线实例化序列化程序的方式存在错误。在内部看起来它使用JobA.getType()实例化序列化器。因此,最好的方法是创建自己的DataSerializer对象,该对象使用typeOf(JobA)并在将消息发送到总线并读取总线时将其传递给它。