2012-06-15 81 views
1

我遇到了序列化問題。我的Silverlight應用程序不會期望我的某個商業對象中的某個屬性,也不知道該如何處理它。以前我已經通過設置一個KnownTypeAttribute來解決這個問題,就像下面的例子一樣,但是在這種情況下它不起作用。序列化不接受我的KnownTypeAttribute,爲什麼?

我已經習慣瞭解決這個問題是這樣的:

[DataContract(Name = "baseClass")] 
public class baseClass { } 

[DataContract(Name = "busObj1")] 
public class busObj1 : baseClass { } 

[DataContract(Name = "busObj2")] 
[KnownType(typeof(busObj1))] 
public class busObj2 : baseClass 
{ 
    public busObj1 myObj { get; set; } 
} 

唯一的區別知道的是,我有稍微不同的結構,像這樣:

[DataContract(Name = "baseClass")] 
public class baseClass { } 

[DataContract(Name = "busObj1")] 
public class busObj1 : baseClass { } 

[DataContract(Name = "busObj2")] 
[KnownType(typeof(busObj1))] 
public class busObj2 : baseClass 
{ 
    public busObj1 myObj { get; set; } 
} 

// This is the class that I want to send via WCF and that cannot be serialized 
// because the serializer doesn't expect busObj1. 
[DataContract(Name = "busObj3")] 
public class busObj3 : busObj2 { } 

我的任何想法非常感謝什麼可能是錯的!

問候,柯樂

回答

5

你需要把已知類型屬性的基礎對象:

[DataContract(Name = "baseClass")] 
[KnownType(typeof(busObj1))] 
[KnownType(typeof(busObj2))] 
[KnownType(typeof(busObj3))] 
[KnownType(typeof(busObj4))] 
public class baseClass { } 

[DataContract(Name = "busObj1")] 
public class busObj1 : baseClass { } 

[DataContract(Name = "busObj2")] 
public class busObj2 : baseClass { } 

[DataContract(Name = "busObj3")] 
public class busObj3 : busObj1 
{ 
    public busObj2 myObj { get; set; } 
} 

[DataContract(Name = "busObj4")] 
public class busObj4 : busObj3 { } 

,或者如果你不想與那些attribtues污染您的域模型,你也可以do it in your web.config or use the ServiceKnownType attribute on your Service Contract

+0

我以前並不需要它。爲什麼在這種情況下? – Clas

+0

我不知道爲什麼你以前不需要它。您尚未顯示您的服務合約的外觀以及客戶可見的類型。 –

+0

您的解決方案爲我做了竅門,儘管對於某些解決方案有時甚至有時不工作仍然很神祕。不管怎麼說,還是要謝謝你! – Clas

相關問題