没有合适的资源?快使用搜索试试~ 我知道了~
首页XmlSerializer使用中的问题
XmlSerializer使用中的问题
需积分: 18 55 下载量 54 浏览量
更新于2023-03-16
收藏 173KB DOC 举报
Troubleshooting Common Problems with the XmlSerializer<br>(译自 http://msdn2.microsoft.com/en-us/library/aa302290.aspx)
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/508393/bg1.jpg)
XmlSerializer 使用中常见的一些问题
!"
#$
适用于
#%&!%'()
摘要: !"讨论了可用于诊断在利用'()*+" 中 ,#- 序列化
技术在 ,#- 和对象之间进行转换时发生的若干常见问题的一些技术。
Contents
引言
,!.
的内在动作
序列化错误
声明序列化类型
反序列化
,#-
的 问题
由 构造函数 产 生的例外
结 束 语
致 谢
引言
在'()*+" 中 ,!. 是一个把强结构化 ,#- 数据映像至'() 对象的
有力工具。,!. 通过一次 /01 调用在 ,#- 文档和您的程序中的对象之间执行
变换。 用于变换的映像规则在'() 类中利用元数据属性进行表述。该程序设计模型带来
了自身固有的一类错误,开发者应学会如何诊断。例如,元数据属性须描述 . 可
处理的 ,#-格式的所有变种。本文将考察用 ,!. 构筑基于 ,#- 的
时可能发生的各种错误,并讨论一些进行诊断的技术和工具。
XmlSerializer 的内在动作
为了有效地解决由 ,#-序列化所引起的问题重要的是要理解在 ,!.的极其简
单的界面下面发生了些什么。和传统的语法分析规范2相反,来自于'()
*+" 中 !,!. 名字空间的 ,!. 把 ,#- 文档绑定
至'() 类的实例。程序员不必编写 34#或 !/, 分析代码,而只需通过在类里直接附加
![](https://csdnimg.cn/release/download_crawler_static/508393/bg2.jpg)
'() 元数据属性声明性地设定绑定规则。由于所有语法分析规则都表达成属性,
,!. 的接口非常简单。它主要包含两个方法,!.从一个对象实例产生
,#-,以及 3.对一个 ,#- 文档作语法分析产生一个对象图。
采用强类型的能正确映像至程序设计对象的严格结构化的 ,#- 格式时,这个方法能顺利
运作。若格式按 5 !
定义,包含复合类型,而不含混合内容或过度使用通配
符 和 6/,则 ,#- 序列化是处理这种数据的好方法。
面向消息的应用就是一个很好的例子,其中应用之间信息交换格式被预先定义。由于许
多用消息驱动的企业应用有很高的吞吐率需求,!.和 3.方法设计得
非常快速。事实上,,!. 也为 !#22名字空间7/!0'()
58和 9.)"!8$
中的极易升级的库提供了动力。
为 ,!. 的高性能付出的代价有二重。其一是给定 ,!.
可以处理的
,#-格式的灵活性,其二是处理相当精细的实例构造。
当您实例化一个 ,!. 时,您必须提供要用该 . 实例进行 . 和
. 的对象的类型。. 检查该类型的所有 字段和属性,弄明该实
例在运行时引用哪些类型。它然后进而利用 ! 34#名字空间中的类建立
:代码作为一组类处置序列化和反序列化。在此过程中,,!. 检查 ,#- 序列
化属性反射的类型把所创建的类定制成 ,#- 格式定义。然后这些类被编译成一个临时组
件供 !.和 3.方法调用以执行 ,#- 至对象的转换。
这个设置 ,!. 和宣示式程序设计模型的精巧过程会导致三类错误,其中有的
可能颇难对付:
所生成的序列化类期待被序列化的对象完全遵守由元数据属性所定义的类型结构。
若 ,!. 遇到任何没有明确地或经由 ,#- 序列化属性宣示的类型,该对
象序列化便会失败。
在以下情形,反序列化都会失败:若根元素无法映像为一个对象类型 ,#- 文档;
文档编写不当,如包含按 ,#-!;
规定的非法字符;还有在有些情形
若文档违反基础架构的限制。
最后,由于各种不同原因,序列化类的创建及其后的编译可能失败。若传给构造
函数的类型,或该类型所参照的类型,要实现一个不被支持的接口或不满足
,!.
施加的限制,类的创建都可能失败。
编译步骤可能失败则可能是由于附加的属性产生了不能编译的 :代码,或由于与
安全性有关的原因。
以下各节将更深入地考察这些情形,并就如何解决问题提供一些指导和建议。
序列化错误
![](https://csdnimg.cn/release/download_crawler_static/508393/bg3.jpg)
我们要考察的第一类错误发生在 !.方法里。当运行时传递给该方法的对象图中
某些类型与设计时该类中声明的类型不匹配,便发生这类错误。您可以经由字段或属性
的类型定义明确声明类型,或隐式地通过附加一个序列化属性声明类型。
图 1. 对象图中的类型声明
这里重要的是要指出,不能依赖于继承性。开发者必须对 ,!. 声明导出类型,
或者对基类附加 ,1 属性,或者对可能保持具有从所声明类型导出的类型的对
象的字段附加 ,( 属性。
作为一个实例,我们来看一下这种类构造体系:
9
<
2*6
=
389
<
2/*6
=
<
9#*6
=
如果您依赖于继承关系编写如下序列化代码:
>?+ 6
>#*?+386在'() 类型系统里
这是合法的赋值
,!..?+,!. 6
)"+"277
@,(38A
剩余11页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)