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