簡體   English   中英

類型xxxx不期望使用xmlinclude或soapinclude

[英]type xxxx not expected use xmlinclude or soapinclude

對於這個序列化問題,我有一個很好奇的案例-在該站點上已經問了很多遍了,我經歷了以下幾個問題,並嘗試了平常的項目,但無濟於事:

  • 將[XmlInclude]添加到引發錯誤的類中
  • 刪除名稱空間
  • 向每個類添加不同的名稱空間

為了進一步解釋,我在下面提供了代碼的簡化版本。 本質上,我使用WebServiceHost對象運行RESTful服務,並且我的一個端點返回一個序列化為XML的對象(我已經用[DataContract][DataMember]屬性注釋了該對象)。 該對象包含一個SerializableDictionary<string, object>此處 ),其中該值已被鍵入為object 我相信這就是失敗的原因:

  • 將值分配為基元時,效果很好
  • 將自定義對象分配給KV對V時, 出現意外的類型異常,可能是因為序列化器不知道如何序列化對象/某種命名空間問題

顯然,我無法使用[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM