我知道那裏有很多類似的問題,但仍然經過幾個小時的搜索後,我沒有找到答案。我希望序列化來自Person類的字段的Child對象。這裏是代碼:DataContract序列化(繼承)
[DataContract]
abstract class Person
{
[DataMember]
protected int level;
[DataMember]
protected string name;
public Person(int level, string name)
{
this.level = level;
this.name = name;
}
}
[DataContract]
[KnownType(typeof(Child))] //With and without it\\
class Child : Person
{
public Child(int level, string name) : base(level , name) {}
}
class Program
{
static void Main(string[] args)
{
//CREATE OBJECTS
List<Person> p = new List<Person>();
Person p1 = new Child(3, "ned"); p1.Display();
Person p2 = new Child(5, "rob"); p2.Display();
p.Add(p1); p.Add(p2);
//SERIALIZER
var ser = new DataContractSerializer(typeof(List<Person>));
//WRITE
FileStream fs = new FileStream("deep.xml", FileMode.Create);
ser.WriteObject(fs, p);
fs.Close();
//READ
FileStream fs2 = new FileStream("deep.xml", FileMode.Open);
List<Person> a = new List<Person>();
a = (List<Person>)ser.ReadObject(fs2);
}
}
這裏是我的問題:
註明爲線 「與不爲」 的序列化似乎工作好,但我不能反序列化它,我得到「SerializationException」,而這樣做:
a = (List<Person>)ser.ReadObject(fs2);
它說,錯誤是在168列是這裏的某個地方:
<Person i:type="Child">
沒有那條線我甚至不能序列化。我得到了SerializationException,它說了一些關於意外類型的東西。這個錯誤來自該行:
ser.WriteObject(fs, p);
有什麼我失蹤?一些解釋說明「有和沒有它」的確切線將會受到歡迎。我試圖找到答案,但微軟網站上的描述不清楚。
我將非常感謝任何幫助。
解決方案: 將[KnownType(typeof(Child))]移動到Person類。在多重繼承的情況下,可以使用多個KnowType屬性。
鏈接到文件:https://msdn.microsoft.com/en-us/library/ms730167%28v=vs.110%29.aspx
我的錯誤是我沒有抄這條線,總有是[DataContract]和錯誤仍然apear但是這最後真的。幫助,謝謝 – Bielik
您是否閱讀了我的答案的其餘部分?您在錯誤的類上有'KnownType'屬性 –
是的,我剛剛編輯回覆,起初沒有看到它,我想糾正錯誤代碼asap抱歉你真的幫助了我,再次感謝。如果我只是問,這是我的序列化測試程序,在原始項目中,我有不止一個班級t從Parent繼承。我怎樣才能在那裏工作? – Bielik