使用Service Bus 1.0的继承类的DataContract和KnownTypes

时间:2014-07-07 16:31:52

标签: .net datacontractserializer datacontract servicebus known-types

您好我有以下类层次结构:

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{
}

不确定我做错了什么?任何想法如何解决这个问题?

2 个答案:

答案 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)并在将消息发送到总线并读取总线时将其传递给它。

相关问题