![](/img/trans.png)
[英]“The type RoleProxy was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.” NHibernate
[英]type xxxx not expected use xmlinclude or soapinclude
對於這個序列化問題,我有一個很好奇的案例-在該站點上已經問了很多遍了,我經歷了以下幾個問題,並嘗試了平常的項目,但無濟於事:
為了進一步解釋,我在下面提供了代碼的簡化版本。 本質上,我使用WebServiceHost
對象運行RESTful服務,並且我的一個端點返回一個序列化為XML的對象(我已經用[DataContract]
和[DataMember]
屬性注釋了該對象)。 該對象包含一個SerializableDictionary<string, object>
( 此處 ),其中該值已被鍵入為object
。 我相信這就是失敗的原因:
顯然,我無法使用[XmlInclude]
注釋Object.cs,並且由於它是一項服務,而且我自己也無法序列化,因此無法使用類似
new Serializer(typeof(...), new Type[] { ... }}
關於我能做什么的任何想法? 我考慮過不要將dict值作為對象輸入,而更具體些,但問題是該值可以采用基元或cusotm類型。 一些代碼可以解釋以上內容:
編輯:更新了下面的代碼以使其更加清晰
[DataContract]
public class ResponseObject
{
[DataMember(Name = "data")]
public SerializableDictionary<string, object> Data { get;set; }
public ResponseObject()
{
Data = new SerializableDictionary<string, object>();
}
}
...
var d1 = new ResponseObject();
d1.Data.Add("some key", "some value"); //WORKS AND SERIALIZES PERFECLTY
var d2 = new ResponseObject();
d2.Data.Add("some other key", new SomeOtherObjecT());
var d3 = new ResponseObject();
d3.Data.Add("another key", d2); //THIS THROWS THE UNEXPECTED TYPE ERROR WHEN SEIRLAIZING SomeOtherObject
編輯:在嘗試序列化類型為ResponseObject的對象的SerializableDictionary中引發該錯誤。 兩者在單獨的項目中-是否有意義?
通常,應將[XmlInclude]添加到ResponseObject類。 在這種情況下,由於您使用的SerializableDictionary,它不起作用。 該類在其實現中創建另一個XmlSerializer,因此它並不關心您的[XmlInclude]。 基本上,它只是無法處理您的用例。 您應該從XmlSerializer切換到DataContractSerializer,后者處理Dictionary類並支持[KnownType]屬性以注冊其他類型: http : //pastebin.com/vGLSaxHF 。 還要注意,在當前情況下添加[DataContract]和[DataMember]屬性毫無意義,因為XmlSerializer會忽略這些屬性,它們僅由DataContractSerializer使用。 或者,如果您不確定如何更改序列化程序(我知道我不是),那么您應該不使用Dictionary或更改SerializableDictionary實現來處理要使用的動態對象類型(在每行找到它會創建一個新的XmlSerializer)。 或者,作為替代方案,為您將要放入字典中的所有對象定義一個基類,並像這樣進行操作:
[XmlInclude(typeof(Class1), XmlInclude(typeof(Class2)), etc]
public class AbstractBase { }
public class Class1 : AbstractBase { ... }
public class Class2 : AbstractBase { ... }
public class BigClass {
public SerializableDictionary<string, AbstractBase> Dictionary { get; set; }
}
這樣,當SerializableDictionary創建自己的XmlSerializer時,它將識別AbstractBase並從那里識別其所有后代。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.