Dot-Net

“類型不是預期的”,使用 DataContractSerializer - 但它只是一個簡單的類,沒有有趣的東西?

  • January 9, 2012

我正在重構我的 XML 序列化,並想試試 DataContractSerializer。一切執行順利,直到需要序列化這個類:

using System;
using System.Runtime.Serialization;

namespace VDB_Sync.Model
{
[DataContract(Name="Konstant")]
public class Konstant : DataFelt
{
   [DataMember]
   private MySqlDbType mydataType;
   [DataMember]
   private object value;

   public Konstant(string navn, MySqlDbType dataType, object value)
       : base(navn, dataType, "*Konstant", false, false)
   {
       //this.navn = navn;
       this.mydataType = dataType;
       this.value = value;

       if (navn.Contains("*Løbenummer"))
       {
           navn = "*Konstant: " + Convert.ToString(value);
       }
   }

   public object Value
   {
       get
       {
           return value;
       }
   }

}
}

它給了我這個:

不應使用數據合同名稱“Konstant:http://schemas.datacontract.org/2004/07/VDB_Sync.Model”鍵入“VDB_Sync.Model.Konstant”。考慮使用 DataContractResolver 或將任何靜態未知的類型添加到已知類型列表中 - 例如,通過使用 KnownTypeAttribute 屬性或將它們添加到傳遞給 DataContractSerializer 的已知類型列表中。

*到目前為止我找到的幫助指向集合和類型。我的班級確實有一個枚舉(MySqlDbType) - 但是得到這個:當我根本沒有聲明 DataMembers 時,我什至得到同樣的錯誤:-x 那麼 - 這裡發生了什麼?我錯過了什麼?

作為參考,這就是我序列化它的方式,VDB_SessionController 是根:*

   public void GemKonfig(VDB_SessionController session)
   {
       var settings = new XmlWriterSettings()
       {
           Indent = true,
           IndentChars = "\t"
       };

       var writer = XmlWriter.Create(defaultFile, settings);
       DataContractSerializer ser =
           new DataContractSerializer(typeof(VDB_SessionController));

       ser.WriteObject(writer, session);
       writer.Close();
   }

正在報告的異常是針對 VDB_Sync.Model.Konstant。這意味著在更遠的地方,這個類被拉到另一個類中,而那個類是被序列化的類。

問題在於,根據 Konstant 在此類中的嵌入方式(例如,如果它位於集合或通用列表中),DataContractSerializer 可能無法在反序列化期間為其外觀做好準備。

要解決此問題,您需要將 known-type 屬性應用於包含 Konstant 的類。根據您的序列化程式碼,我懷疑這是VDB_SessionController.

所以,試著用 KnownType 屬性裝飾這個類:

[KnownType(typeof(VDB_Sync.Model.Konstant)]
public class VDB_SessionController

引用自:https://stackoverflow.com/questions/8794594