System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization.dll 中发生_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization.dll 中发生

System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization.dll 中发生

 2014/10/27 15:17:25  Ares丶滇  程序员俱乐部  我要评论(0)
  • 摘要:异常信息:“System.Runtime.Serialization.SerializationException”类型的未经处理的异常在System.Runtime.Serialization.dll中发生其他信息:不应为数据协定名称为“Teacher:http://schemas.datacontract.org/2004/07/ConsoleApplication3”的类型“ConsoleApplication3
  • 标签:system RIA 异常

异常信息:

“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);
logs_code_hide('3e068bc8-2f19-44f0-aea7-6f8898023c72',event)" src="/Upload/Images/2014102715/2B1B950FA3DF188F.gif" alt="" />
 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     }

输出结果:

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" alt="" />

关于更详细的描述,请参考以下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

上一篇: MTLableAlertDemo 下一篇: 没有下一篇了!
发表评论
用户名: 匿名