0

您好我有下面的类层次结构:DataContract和继承的类KnownTypes使用服务总线1.0

public class SuperJob{ 
} 

public class JobA:SuperJob{ 
} 

public class JobB:SuperJob{ 
} 

当我尝试deserialise一个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

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+2

请发布您的反序列化代码。 –

+0

...还有序列化代码。 –

回答

0

设法解决这个问题,没有在服务总线实例的串行器方式的错误。看起来像内部它使用JobA.getType()实例化串行器。所以最好的方法是创建自己的使用typeOf(JobA)的DataSerializer对象,并在将消息发送到总线并读取总线时通过它。

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);