0

嗨,我有以下类层次结构:

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

不知道我做错了什么?任何想法我该如何解决这个问题?

4

2 回答 2

0

设法解决了这个问题,服务总线实例化串行器的方式存在错误。看起来在内部它用 JobA.getType() 实例化了序列化器。因此,最好的方法是创建您自己的 DataSerializer 对象,该对象使用 typeOf(JobA) 并在将消息发送到总线和读取总线时都将其传递。

于 2014-07-09T13:56:53.213 回答
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);
于 2014-07-07T17:04:34.993 回答