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 的已知类型列表。
想要序列化的对象:
public class Student : People
{
public Int32 Age { get; set; }
}
public abstract class People
{
public string Name { get; set; }
public string Address { get; set; }
}
序列化的方法:
public static string WriteJson<T>(T t)
{
using (MemoryStream ms = new MemoryStream())
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(ms, t);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
方法调用:
People p = new Student()
{
Name = "小明",
Address = "章丘路110号",
Age =
}; string jsonString = WriteJson<People>(p);
Console.WriteLine(jsonString);
然后就有了上面的异常
根据异常可以知道,虽然Student继承了People类,但是序列化的时候是People类型,也就是说序列化的时候并不知道 想要序列化的对象(Student类型),故产生了异常;根据异常提示,有两种解决方案:考虑使用 DataContractResolver,或将任何未知类型以静态方式添加到已知类型的列表。
经过了MSDN一番查询后,得到了两种可以序列化继承关系的对象的方法,
方式一,继承DataContractResolver类来实现:
public abstract class Animal
{
public string Name { get; set; }
} public class Bird : Animal
{
public string Color { get; set; }
public Feather BDeather { get; set; }
} public class Feather
{
public string Color { get; set; }
}
public static string WriteJson<T>(T t)
{
using (MemoryStream ms = new MemoryStream())
{
Assembly assembly = Assembly.Load(new AssemblyName("ConsoleApplication3"));
DataContractSerializer serializer = new DataContractSerializer(typeof(T), null, Int32.MaxValue, false, true, null, new MyDataContractResolver(assembly));
serializer.WriteObject(ms, t);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
Animal animal = new Bird()
{
Name = "鸭子",
Color = "白色",
BDeather = new Feather() { Color="纯白色"}
};
string jsonString = WriteJson<Animal>(animal);
Console.WriteLine(jsonString);
public class MyDataContractResolver : DataContractResolver
{ private XmlDictionary dictionary = new XmlDictionary();
Assembly assembly;
public MyDataContractResolver(Assembly assembly)
{
this.assembly = assembly;
}
public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
{
Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, knownTypeResolver);
if (type == null)
{
type = Type.GetType(typeName + ", " + typeNamespace);
}
return type;
} public override bool TryResolveType(Type type, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
{
knownTypeResolver.TryResolveType(type, declaredType, knownTypeResolver, out typeName, out typeNamespace);
if (typeName == null || typeNamespace == null)
{
XmlDictionary dictionary = new XmlDictionary();
typeName = dictionary.Add(type.FullName);
typeNamespace = dictionary.Add(type.Assembly.FullName);
}
return true;
}
}
输出结果:
方式二,通过KnownTypeAttribute添加识别类型:
[KnownType(typeof(Student))]
[KnownType(typeof(Teacher))]
[KnownType(typeof(Pupil))]
[DataContract]
public abstract class People
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Address { get; set; }
}
public class Student : People
{ public Int32 Age { get; set; }
} public class Pupil : Student
{ }
public class Teacher : People
{
public Course T_course { get; set; }
} public class Course
{
public string Name { get; set; }
public int Times { get; set; }
}
输出结果:
aaarticlea/png;base64,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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
System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization.dll 中发生的更多相关文章
- “System.InvalidOperationException”类型的未经处理的异常在 ESRI.ArcGIS.AxControls.dll 中发生
问题描述: 新手们进行ArcGIS ArcObject开发时经常会遇到各种十分古怪的问题,比如下面的这个问题: “System.InvalidOperationException”类型的未经处理的异常 ...
- “System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。
如果你的 WebService 客户端证书配置都没问题,唯独调用接口会出现这个错误 “System.FormatException”类型的未经处理的异常在 System.IdentityModel.d ...
- System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其它信息:尝试读取或写入受保护的内存。这通常指示其它内存已损坏。
错误背景: 操作系统:编程环境:VS2013. 语言:VB.net: 数据库:SQLserver2008 做数据库连接时.发生的错误: 错误提示为: 说明:用VB.net连接SQLServer数据 ...
- “System.Runtime.InteropServices.COMException”类型的第一次机会异常在 ESRI.ArcGIS.Version.dll 中发生
“System.Runtime.InteropServices.COMException”类型的第一次机会异常在 ESRI.ArcGIS.Version.dll 中发生 其他信息: The speci ...
- System.Windows.Forms.AxHost.InvalidActiveXStateException”类型的异常在 ESRI.ArcGIS.AxControls.dll 中发生,但未在用户代码中进行处理
private void CopyAndOverwriteMap() { //IObjectCopy接口变量申明 IObjectCopy objectCopy = new ObjectCopyClas ...
- “RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理
错误信息: "RazorEngine.Templating.TemplateCompilationException"类型的异常在 RazorEngine.NET4.0.dll 中 ...
- “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
用管理员身份运行CMD:netsh winsock reset就可以解决
- “RazorEngine.Templating.TemplateParsingException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理 其他信息: Expected model identifier.
这个问题是由于在cshtml中 引用了model这个单词 它可能和Model在解析时有冲突. 解决方法:把model换成别的单词就可以了.
- MVC开发中的常见错误-04-“System.NullReferenceException”类型的异常在 BBFJ.OA.WebApp.dll 中发生,但未在用户代码中进行处理
未将对象引用设置到对象实例,又名空指针异常,伴随程序员开发的一生. 查看详细信息得知: SetUserRoleInfo() 首先想到的是 IBLL.IRoleInfoService RoleInfo ...
随机推荐
- Python的RSA加密和PBE加密
最近在写接口的时候,遇到了需要使用RSA加密和PBE加密的情况,对方公司提供的DEMO都是JAVA的,我需要用python来实现. 在网上搜了一下,python的RSA加密这块写的还是比较多的,但是P ...
- [刷题]算法竞赛入门经典(第2版) 5-2/UVa1594 - Ducci Sequence
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,20 ms) //UVa1594 - Ducci Sequence #include< ...
- [刷题]算法竞赛入门经典 3-4/UVa455 3-5/UVa227 3-6/UVa232
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa455:Periodic Strings 代码: //UVa455 #inclu ...
- Java内存使用量测试
JVM内存使用量测试测试各种不同的数据结构在JVM中的内存使用量 import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import java.lang. ...
- JAVA的Condition详解
Condition 将 Object 监视器方法(wait().notify()和notifyAll())分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 s ...
- python 分片
有些书中叫做分片,有些书中叫做切片,翻译时的一些误差) 概念:将序列按段进行切割 作用:通过分片操作符来访问一定范围内的元素 实现:分片是通过两个冒号相隔的索引来实现 范围:符合序列特性即可使用切片功 ...
- PHP简单分页省略中间页码
<?php /** * @desc created by sublime text3 * @author jxl <[57953279@qq.com>]> * @since 2 ...
- 一个基于thinkphp的微信授权登陆功能
共享一份基于thinkphp开发的用户授权登陆的功能代码,本实例使用thinkphp的第三方微信公众平台PHP-SDK,地址https://github.com/dodgepudding/wechat ...
- Linux-Zabbix 邮件报警设置
系统环境 Ubuntu 16.04 在Zabbix服务器端 安装sendmail sudo apt install sendmail 测试发送邮件 echo "正文!" | mai ...
- MySql学习笔记(五) —— 存储过程
存储过程是MySql 5支持的特性,它是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之 ...