異常信息:
“System.Runtime.Serialization.SerializationException”類型的未經處理的異常在 System.Runtime.Serialization.dll 中發生
其他信息: 不應為數據協定名稱為“Teacher:http://schemas.datacontract.org/2004/07/ConsoleApplication3”的類型“ConsoleApplication3.Teacher”。請考慮使用 DataContractResolver,或將任何未知類型以靜態方式添加到已知類型的列表。例如,可以使用 KnownTypeAttribute 特性,或者將未知類型添加到傳遞給 DataContractSerializer 的已知類型列表。
想要序列化的對象:
1 public class Student : People
2 {
3 public Int32 Age { get; set; }
4 }
1 public abstract class People
2 {
3 public string Name { get; set; }
4 public string Address { get; set; }
5 }
序列化的方法:
1 public static string WriteJson<T>(T t)
2 {
3 using (MemoryStream ms = new MemoryStream())
4 {
5 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
6 serializer.WriteObject(ms, t);
7 return Encoding.UTF8.GetString(ms.ToArray());
8 }
9 }
方法調用:
1 People p = new Student()
2 {
3 Name = "小明",
4 Address = "章丘路110號",
5 Age = 14
6 };
7
8 string jsonString = WriteJson<People>(p);
9 Console.WriteLine(jsonString);
然後就有了上面的異常
根據異常可以知道,雖然Student繼承了People類,但是序列化的時候是People類型,也就是說序列化的時候並不知道 想要序列化的對象(Student類型),故產生了異常;根據異常提示,有兩種解決方案:考慮使用 DataContractResolver,或將任何未知類型以靜態方式添加到已知類型的列表。
經過了MSDN一番查詢後,得到了兩種可以序列化繼承關系的對象的方法,
方式一,繼承DataContractResolver類來實現:
1 public abstract class Animal
2 {
3 public string Name { get; set; }
4 }
5
6 public class Bird : Animal
7 {
8 public string Color { get; set; }
9 public Feather BDeather { get; set; }
10 }
11
12 public class Feather
13 {
14 public string Color { get; set; }
15 }
1 public static string WriteJson<T>(T t)
2 {
3 using (MemoryStream ms = new MemoryStream())
4 {
5 Assembly assembly = Assembly.Load(new AssemblyName("ConsoleApplication3"));
6 DataContractSerializer serializer = new DataContractSerializer(typeof(T), null, Int32.MaxValue, false, true, null, new MyDataContractResolver(assembly));
7 serializer.WriteObject(ms, t);
8 return Encoding.UTF8.GetString(ms.ToArray());
9 }
10 }
1 Animal animal = new Bird()
2 {
3 Name = "鴨子",
4 Color = "白色",
5 BDeather = new Feather() { Color="純白色"}
6 };
7 string jsonString = WriteJson<Animal>(animal);
8 Console.WriteLine(jsonString);
1 public class MyDataContractResolver : DataContractResolver
2 {
3
4 private XmlDictionary dictionary = new XmlDictionary();
5 Assembly assembly;
6 public MyDataContractResolver(Assembly assembly)
7 {
8 this.assembly = assembly;
9 }
10 public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
11 {
12 Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, knownTypeResolver);
13 if (type == null)
14 {
15 type = Type.GetType(typeName + ", " + typeNamespace);
16 }
17 return type;
18 }
19
20 public override bool TryResolveType(Type type, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
21 {
22 knownTypeResolver.TryResolveType(type, declaredType, knownTypeResolver, out typeName, out typeNamespace);
23 if (typeName == null || typeNamespace == null)
24 {
25 XmlDictionary dictionary = new XmlDictionary();
26 typeName = dictionary.Add(type.FullName);
27 typeNamespace = dictionary.Add(type.Assembly.FullName);
28 }
29 return true;
30 }
31 }
View Code
輸出結果:
方式二,通過KnownTypeAttribute添加識別類型:
1 [KnownType(typeof(Student))]
2 [KnownType(typeof(Teacher))]
3 [KnownType(typeof(Pupil))]
4 [DataContract]
5 public abstract class People
6 {
7 [DataMember]
8 public string Name { get; set; }
9 [DataMember]
10 public string Address { get; set; }
11 }
1 public class Student : People
2 {
3
4 public Int32 Age { get; set; }
5 }
6
7 public class Pupil : Student
8 {
9
10 }
1 public class Teacher : People
2 {
3 public Course T_course { get; set; }
4 }
5
6 public class Course
7 {
8 public string Name { get; set; }
9 public int Times { get; set; }
10 }
輸出結果:
關於更詳細的描述,請參考以下MSDN的內容:
http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.knowntypeattribute.aspx
http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datacontractserializer%28v=vs.110%29.aspx
很明顯是死循環了啊。。。set方法被無限調用了。
為什麼會死循環:
你給ParentId賦值,就會調用 Set{ ParentId = value}
然後set 裡面的ParentId又會調用Set{ ParentId = value} 這不死循環了麼?
正確的做法:
寫成下面:Public int ParentId { get ; set; }
或者: private int _parentId ;
Public int ParentId
{
get { return _parentId;}
set { _parentId = value;}
}
其他的屬性也都錯了,都要改過來。get方法也是。
不是說清楚了麼
其他信息: 端口"COM1”不存在。”的錯誤
所以你應該去檢查com1端口是不是已經被別的程序占用了,你可以換個端口的