Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > VB.NET > NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
【标  题】:NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
【关键字】:NETCF,XmlSerializer
【来  源】:http://www.cnblogs.com/swnuwangyun/archive/2006/12/15/593577.html

NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)

Your Ad Here NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三) - swnuwangyun - 博客园
  博客园 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  22 随笔 :: 1 文章 :: 13 评论 :: 0 Trackbacks

首先,来看一个简单的例子,其在PC和PDA上均可以顺利的序列化和反序列化。

namespace RFID.ReaderProxy
{
    [System.Xml.Serialization.XmlTypeAttribute(Namespace 
= "")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace 
= "urn:epcglobal:rp:xsd:1", IsNullable = false)]
    
public partial class TriggerCommand
    
{
        [XmlElementAttribute(Form 
= XmlSchemaForm.Qualified)]
        
public string name;

        [XmlElementAttribute(
"create"typeof(int), Form = XmlSchemaForm.Qualified)]
        [XmlElementAttribute(
"setHandle"typeof(double), Form = XmlSchemaForm.Qualified)]
        [XmlElementAttribute(
"fire"typeof(string), Form = XmlSchemaForm.Qualified)]
        
public object Item;
    }

}

在特定测试代码下其序列化后的XML文档如下
<?xml version="1.0"?>
<ns:TriggerCommand xmlns:ns="urn:epcglobal:rp:xsd:1">
  
<name>hello</name>
  
<setHandle>123.456</setHandle>
</ns:TriggerCommand>

这个类中的成员实际上对应这XSD中的choice,当choice中的选项具有不同的类型和不同的名称时(如上例),XmlSerialize会自动识别数据的类型,仅需一个object类型的字段即可,程序可以强制对item进行类型转换。

下面根据我们的扩展性和兼容性需要,处理XSD中的any, 修改后的代码如下:其中添加了[XmlAnyElementAttribute()]
namespace RFID.ReaderProxy
{
    [System.Xml.Serialization.XmlTypeAttribute(Namespace 
= "")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace 
= "urn:epcglobal:rp:xsd:1", IsNullable = false)]
    
public partial class TriggerCommand
    
{
        [XmlElementAttribute(Form 
= XmlSchemaForm.Qualified)]
        
public string name;

        [XmlAnyElementAttribute()]
        [XmlElementAttribute(
"create"typeof(int), Form = XmlSchemaForm.Qualified)]
        [XmlElementAttribute(
"setHandle"typeof(double), Form = XmlSchemaForm.Qualified)]
        [XmlElementAttribute(
"fire"typeof(string), Form = XmlSchemaForm.Qualified)]
        
public object Item;
    }

}

在PC下面测试时,可以输出相同的XML文档,但在PDA上测试时,创建XmlSerializer的时候得到如下的异常:
You need to add XmlChoiceIdentifierAttribute to the 'Item' member.

可能是在NETCF下面无法区分XmlElement和其它的类型吧,从而破坏了“当choice中的选项具有不同的类型和不同的名称时”约束,因此尝试性的加入自定义枚举类,代码如下:
namespace RFID.ReaderProxy
{
    [System.Xml.Serialization.XmlTypeAttribute(Namespace 
= "")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace 
= "urn:epcglobal:rp:xsd:1", IsNullable = false)]
    
public partial class TriggerCommand
    
{
        [XmlElementAttribute(Form 
= XmlSchemaForm.Qualified)]
        
public string name;

        [XmlAnyElementAttribute()]
        [XmlElementAttribute(
"create"typeof(int), Form = XmlSchemaForm.Qualified)]
        [XmlElementAttribute(
"setHandle"typeof(double), Form = XmlSchemaForm.Qualified)]
        [XmlElementAttribute(
"fire"typeof(string), Form = XmlSchemaForm.Qualified)]
        [XmlChoiceIdentifierAttribute(
"ItemElementName")]
        
public object Item;

        [XmlIgnoreAttribute()]
        
public TriggerCommandItemChoiceType ItemElementName;
    }


    [System.Xml.Serialization.XmlTypeAttribute(Namespace 
= "")]
    
public enum TriggerCommandItemChoiceType
    
{
        [System.Xml.Serialization.XmlEnumAttribute(
"##any:")]
        Item,

        [XmlEnumAttribute(Name 
= "create")]
        create,

        [XmlEnumAttribute(Name 
= "setHandle")]
        setHandle,

        [XmlEnumAttribute(Name 
= "fire")]
        fire
    }

}

OK,现在PC和PDA上均可以获得相同的XML输出了。

至此,复杂对象在NETCF中的序列化所遇到的问题基本上解决了,当然,要处理EPC中复杂的XSD并让其在NETCF中正常工作,还需要很多额外的工作,后面等总结出来后再发上来。
posted on 2006-12-15 18:02 王云 阅读(221) 评论(0)  编辑 收藏 引用 网摘
制作统计图__柱状图/饼图__可直接调用(附全码):【上一篇】
实体对象的状态设计:【下一篇】
【相关文章】
  • CardViewer系列之准备篇--J2ME vs .netCF
  • 用C#开发.NETCF蓝牙通信模块
  • NETCF运行平台检测
  • NETCF开发之POOM应用开发——简介
  • NETCF开发之POOM应用开发——任务管理
  • NETCF开发之压缩和解压缩
  • NETCF开发之POOM应用开发简介
  • NETCF开发之使用资源文件
  • NETCF开发之移动Web网站安全性
  • NETCF开发之用户界面设计
  • 【随机文章】
  • 正则表达式简介(微软)--8.特殊字符
  • 负载均衡技术(ZT)
  • SAP ABAP实现农历转成公历(三)
  • c/c++ 书籍、网页、文档、资料
  • 打造完美Linux操作系统:实用小窍门
  • 计算机硬件常识
  • Backing up the localhost (BackupPC server)
  • 席峰科技-最优秀的网络服务提供商
  • 《WINDOWS核心编程》读书笔记--第2章:Unicode
  • 走进流动的世界
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.