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

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

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

第一篇中的问题已经弄清楚了,xsd.exe生成的代码是供PC平台使用的,不能保证修改后可以运行在NETCF平台上,我的想法是NETCF中的XmlSerializer与完整版的内部处理逻辑可能不一样,有些方面的处理能力可能有些弱,这里我暂时把Unqualified不能在NETCF中使用的问题归结为NETCF中的BUG,下面调整努力方向为:手工大幅修改xsd.exe自动生成的代码。

<create xmlns="">123</create>中xmlns=""的问题已经弄清楚,正是因为Unqualified的作用使得xml文档中只有根节点具有targetNamespace的命名空间,而其它字节点的命名空间是空的,因此要在每个子节点上面加上xmlns=""的属性,在随后的处理中,我们可以通过在根节点上加前缀来简化xml文档。

冒号的问题暂时还是不清楚,不过对整体的影响不大。

实际上第一篇中介绍的方法生成的xml文档并不符合我的需求,需求中要求根节点具有指定的命名空间,而其它字节点的命名空间为空,而我将Unqualified改为Qualified恰恰破坏了这个规则,因此,后面我将通过其它的方法来处理。

下面为调整后的源代码:

namespace RFID.ReaderProxy
{
    [XmlTypeAttribute(Namespace 
= "")]
    [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(
"fire"typeof(int), Form = XmlSchemaForm.Qualified)]
        [XmlChoiceIdentifierAttribute(
"ItemElementName")]
        
public int Item;

        [XmlIgnoreAttribute()]
        
public TriggerCommandItemChoiceType ItemElementName;
    }


    [XmlTypeAttribute(Namespace 
= "", IncludeInSchema = false)]
    
public enum TriggerCommandItemChoiceType
    
{
        [XmlEnumAttribute(Name 
= "create")]
        create,

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

}

[XmlTypeAttribute(Namespace = "")]作用于所有的类型中,正好消除了Qualified带来的命名空间问题,而根节点的命名空间则由[XmlRootAttribute(Namespace = "urn:epcglobal:rp:xsd:1", IsNullable = false)]来限定。

测试代码中序列化的代码调整为:

TriggerCommand tc = new TriggerCommand();
            tc.Item 
=123;
            tc.name 
= "hello";
            XmlSerializer xml 
= new XmlSerializer(typeof(TriggerCommand));

            XmlSerializerNamespaces ns 
= new XmlSerializerNamespaces();
            ns.Add(
"ns""urn:epcglobal:rp:xsd:1");

            FileStream fs 
= File.Create("a.xml");
            xml.Serialize(fs, tc,ns);

            fs.Close();

这样最终生成的XML文档中众多的xmlns=""将会被删除,转由根节点的前缀处理,文档大小大幅减少,下面为生成的XML文档:
<?xml version="1.0"?>
<ns:TriggerCommand xmlns:ns="urn:epcglobal:rp:xsd:1">
  
<name>hello</name>
  
<create>123</create>
</ns:TriggerCommand>

估计这样修改后的源码可能无法通过XSD文档的检验,但是其输出的XML文档是等效的,相同的XML结构应该可以使用不同的XSD来描述。
posted on 2006-12-15 17:06 王云 阅读(257) 评论(2)  编辑 收藏 引用 网摘
实体对象的状态设计:【上一篇】
CLI 架构(Architecture):【下一篇】
【相关文章】
  • NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
  • CardViewer系列之准备篇--J2ME vs .netCF
  • 用C#开发.NETCF蓝牙通信模块
  • NETCF运行平台检测
  • NETCF开发之POOM应用开发——简介
  • NETCF开发之POOM应用开发——任务管理
  • NETCF开发之压缩和解压缩
  • NETCF开发之POOM应用开发简介
  • NETCF开发之使用资源文件
  • NETCF开发之移动Web网站安全性
  • 【随机文章】
  • 使用Xnest
  • 基于S3c4510b芯片的系统中的地址重映射的实现
  • 在 DB2 Universal Database 中使用暂挂 I/O 实现分割镜像
  • 一个简单有穷自动机(DFA)的实现
  • Visual C#.Net网络程序开发-Tcp篇(3)
  • 让ASP也可以连接MYSQL 
  • 科普知识
  • 单元测试,TestNG,Junit
  • porting_note
  • Welcome to the home of OpenAFS
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.