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

异常信息:

“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     }

输出结果:

方式二,通过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

时间: 2024-10-05 11:53:49

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

“System.InvalidOperationException”类型的未经处理的异常在 ESRI.ArcGIS.AxControls.dll 中发生

问题描述: 新手们进行ArcGIS ArcObject开发时经常会遇到各种十分古怪的问题,比如下面的这个问题: “System.InvalidOperationException”类型的未经处理的异常在 ESRI.ArcGIS.AxControls.dll 中发生 其他信息: ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components. 此时虽然程序能正

关于WPF 中 “System.Windows.Markup.XamlParseException”类型的未经处理的异常在 PresentationFramework.dll 中发生 异常的处理。

前几天做一个项目的时候出现了一个异常: “System.Windows.Markup.XamlParseException”类型的未经处理的异常在 PresentationFramework.dll 中发生 其他信息: “在“System.Windows.Markup.StaticResourceHolder”上提供值时引发了异常.”,行号为“8”,行位置为“33”. 现象描述: 在处理界面时,界面上增加了一个LISTBOX来处理接收来的数据,单击列表中的其中一项时会弹出详细信息.所以我就在样式

“System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。

如果你的 WebService 客户端证书配置都没问题,唯独调用接口会出现这个错误 "System.FormatException"类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效. 解决办法: 打开你的证书列表,找到证书指纹: 接下来是重点,复制的时候,切记不要用全选,像这样: 要用鼠标仔细的从第一个"可见"字符选起,到"可见"字符结束,像这样: 请仔细对比以上两张图的差别,不

System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生

错误背景: 操作系统:编程环境:VS2013:  语言:VB.net:  数据库:SQLserver2008 做数据库连接时,发生的错误: 错误提示为: 说明:用VB.net连接SQLServer数据库 第一种情况: 连接字符串为"Server=(Local);Database=charge_sys;UserID = sa;Password=123456"时,连接没问题: 第二种情况: 当把" Server=(Local)"换为 " Server=192.

System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其它信息:尝试读取或写入受保护的内存。这通常指示其它内存已损坏。

错误背景: 操作系统:编程环境:VS2013.  语言:VB.net:  数据库:SQLserver2008 做数据库连接时.发生的错误: 错误提示为: 说明:用VB.net连接SQLServer数据库 第一种情况: 连接字符串为"Server=(Local);Database=charge_sys;UserID = sa;Password=123456"时,连接没问题: 另外一种情况: 当把" Server=(Local)"换为 " Server=192

MongoDB 3.0 关于安全认证后使用C#调用碰上“System.TimeoutException”类型的异常在 MongoDB.Driver.Core.dll 中发生的相关问题

"System.TimeoutException"类型的异常在 MongoDB.Driver.Core.dll 中发生,但未在用户代码中进行处理 操作MongoDB类库版本: ---------------------------------------------- MongoDB.Driver 2.3 MongoDB.Driver.Core 2.3 MongoDB.Bson 2.3 MongoDB 版本 3.0 连接字符串的相关变化: -----------------------

“RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理

错误信息: 其他信息: Unable to compile template. "object"不包含"username"的定义,并且找不到可接受类型为"object"的第一个参数的扩展方法"username"(是否缺少 using 指令或程序集引用?) Other compilation errors may have occurred. Check the Errors property for more informat

未经处理的异常在 System.Data.dll 中发生。其他信息:在应使用条件的上下文(在 &#39;***&#39; 附近)中指定了非布尔类型的表达式。

机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在UI层做个判断并生成查询条件strCondition. 在机房收费系统的"联合查询"模块中出现的问题:"System.Data.SqlClient.SqlException"类型的未经处理的异常在 System.Data.dll 中发生.其他信息: 在应使用条件的上下文(在 '@strCondition' 附近)中指定了非布尔类型的表达式. 出错的DAL层代码为: Pu

未经处理的异常在 System.Data.dll 中发生。其它信息:在应使用条件的上下文(在 &amp;#39;***&amp;#39; 附近)中指定了非布尔类型的表达式。

机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在UI层做个推断并生成查询条件strCondition. 在机房收费系统的"联合查询"模块中出现的问题:"System.Data.SqlClient.SqlException"类型的未经处理的异常在 System.Data.dll 中发生.其它信息: 在应使用条件的上下文(在 '@strCondition' 附近)中指定了非布尔类型的表达式. 出错的DAL层代码为: Pu