zoukankan      html  css  js  c++  java
  • Xsd: Xml序列化、反序列化的利器

    下面讲述根据xml生成对应序列化反序列化类的过程,xml需要首先转化为xsd,然后再生成为实体类。其中,XSD是XML Schema Definition的缩写。

    1.制作xml文件:

     

    <?xml version="1.0" encoding="utf-8" ?>
    <root>
        <function id="20e001" type="select" name="风速">
            <operation name="开机">30e002</operation>
            <operation name="关机">30e001</operation>
        </function>
        <function id="60e003" type="input"/>
        <function id="20e004" type="select" name="风速">
            <operation name="超高风">30e0W1</operation>
            <operation name="高风">30e0W2</operation>
        </function>
    </root>

    2.打开vs的command line:

    CD到目标目录(此次测试目标目录是D盘);

    image

    首先使用xsd命令生成xsd,格式是xsd + xml文件,默认就是会在当前目录下生成xsd文件(此次测试,执行命令后将会在D盘根目录下生成同名的xsd文件;

    image

    接着是生成实体类:命令格式是xsd + xsd文件,默认会在当前目录下生成.cs的类文件;

    image

    3.程序实现反序列化以及序列化

    private void AddNode()
    {
        try
        {
            XmlSerializer ser = new XmlSerializer(typeof(root));
    
            FileStream fs = new FileStream(@"D:XMLFile1.xml", FileMode.Open);
            root root = ser.Deserialize(fs) as root;
            //fs.Close();
    
            rootFunctionOperation op = new rootFunctionOperation();
            op.name = "20e005";
            op.Value = "30e002";
    
            rootFunction rf = new rootFunction();
            rf.name = "上下扫风";
            rf.operation.Add(op);
    
            root.Items.Add(rf);
    
            fs = new FileStream(@"D:XMLFile1.xml", FileMode.Open, FileAccess.Write);
            ser.Serialize(fs, root);
            fs.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    4.注意点

    1.使用xsd生成的父节点的类型是数组类型,不方便增加子项,需要统一修改为List<T>,同时直接new成实例,这样操作方便;尝试ToList但是发现无法真正的的插入到元数组中,我理解ToList()方法其实是新建立了一个List对象,所有的操作针对新建的List,除非再次重新toArray();

    2.序列化的FileStream无法和反序列化的FileStream共享,反序列化应用完成后,一定需要close,序列化的时候再new一个新的FileStream,然后调用Serialize方法,否则将会以apppend的方式,将root对象添加到xml文件的底部;

    参考:

    http://msdn.microsoft.com/zh-cn/library/x6c1kb0s

    http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer

  • 相关阅读:
    C++容器不要类型转换
    栈区、堆区、全局区、文字常量区、程序代码区
    C++数据类型字节数
    Exception-Safe Generic Containers
    饭碗是要靠抢的
    Wireshark抓包实例分析TCP重复ACK与乱序
    OSPF
    孩子,我该让你更好的长大!
    云,除了卖,我们还剩下什么?
    动态路由3--链路状态路由选择协议
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/3378495.html
Copyright © 2011-2022 走看看