我重构我的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; } } } }
它给我这个:
Type ‘VDB_Sync.Model.Konstant’ with data contract name ‘Konstant:http://schemas.datacontract.org/2004/07/VDB_Sync.Model’ is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types – for example,by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to 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