一、定义元数据

XML序列化常用属性:XMLRoot,XMlType、XMLText、XMLEnum等

[Serializable]
[XmlRoot]
public class Product
{
    public int ProductID { set; get; }//默认为[XmlElement("ProductID")] 

    [XmlAttribute("Discount")]
    public int DisCount { set; get; }
}

public class BookProduct : Product
{
    public BookProduct() { }
    public string ISBN { get; set; }
}

[XmlRoot("inv")]
public class Inventory
{
    public Inventory() { }
    [XmlArray("allpro")]
    [XmlArrayItem("prod", typeof(Product)),
     XmlArrayItem("book", typeof(BookProduct))]
    public Product[] InventroyItems { set; get; }
}

二、简单序列化与反序列化

Product product = , DisCount =  };
string s = "";
using (StringWriter sw = new StringWriter())
{
    XmlSerializer xz = new XmlSerializer(typeof(Product));
    xz.Serialize(sw, product);
    s = sw.ToString();
}
Console.WriteLine(s);

Product info = SimpleSerializer.Deserialize(typeof(Product), s) as Product;
using (StringReader sr = new StringReader(s))
{
    XmlSerializer xz = new XmlSerializer(typeof(Product));
    info = xz.Deserialize(sr) as Product;
}

Console.WriteLine(info.ProductID.ToString() + ", " + info.DisCount);

三、集合的序列化与反序列化

List<Product> list = new List<Product>(){
    , DisCount = },
    , DisCount =, ISBN="aaaa"}
};
Inventory invertoy = new Inventory { InventroyItems = list.ToArray() };

string s = "";
using (StringWriter sw = new StringWriter())
{
    XmlSerializer xz = new XmlSerializer(typeof(Inventory));
    xz.Serialize(sw, invertoy);
    s = sw.ToString();
}
Console.WriteLine(s);

using (StringReader sr = new StringReader(s))
{
    XmlSerializer xz = new XmlSerializer(typeof(Inventory));
    invertoy = xz.Deserialize(sr) as Inventory;
}

Console.WriteLine(invertoy.InventroyItems[].ProductID.ToString() + ].DisCount);

Console.ReadKey();

四、在不能更改数据的情况下,可以用代码重载XmlAttributeOverrides

string s = "";
using (StringWriter sw = new StringWriter())
{
    XmlAttributes attrs = new XmlAttributes();
    attrs.XmlElements.Add(new XmlElementAttribute("product1", typeof(Product)));
    attrs.XmlElements.Add(new XmlElementAttribute("book1", typeof(BookProduct)));
    XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
    attrOverrides.Add(typeof(Inventory), "InventroyItems", attrs);
    XmlSerializer xz = new XmlSerializer(typeof(Inventory), attrOverrides);

    xz.Serialize(sw, invertoy);
    s = sw.ToString();
}
Console.WriteLine(s);

using (StringReader sr = new StringReader(s))
{
    XmlAttributes attrs = new XmlAttributes();
    attrs.XmlElements.Add(new XmlElementAttribute("product1", typeof(Product)));
    attrs.XmlElements.Add(new XmlElementAttribute("book1", typeof(BookProduct)));
    XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
    attrOverrides.Add(typeof(Inventory), "InventroyItems", attrs);
    XmlSerializer xz = new XmlSerializer(typeof(Inventory), attrOverrides);
    invertoy = xz.Deserialize(sr) as Inventory;
}

Console.WriteLine(invertoy.InventroyItems[].ProductID.ToString() + ].DisCount);

五、通用类

public class SimpleSerializer
{
    /// <summary>
    /// 序列化对象
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="t">对象</param>
    /// <returns></returns>
    public static string Serialize<T>(T t)
    {
        using (StringWriter sw = new StringWriter())
        {
            XmlSerializer xz = new XmlSerializer(t.GetType());
            xz.Serialize(sw, t);
            return sw.ToString();
        }
    }

    /// <summary>
    /// 反序列化为对象
    /// </summary>
    /// <param name="type">对象类型</param>
    /// <param name="s">对象序列化后的Xml字符串</param>
    /// <returns></returns>
    public static object Deserialize(Type type, string s)
    {
        using (StringReader sr = new StringReader(s))
        {
            XmlSerializer xz = new XmlSerializer(type);
            return xz.Deserialize(sr);
        }
    }

}

XML序列化 System.Xml.Serialization的更多相关文章

  1. Unity使用Mono.Xml代替System.Xml 测试

    测试环境 操作系统:Windows8.1 开发工具:Unity5.5.2 1.新建一个测试项目,观测引用System.Xml与Mono.Xml解析文件正确性,与打包后APK体积大小. 2.Mono.X ...

  2. 基础命名空间:序列化 System.Runtime.Serialization

    对象通常都有状态(state),从一个对象中抽取这种状态,不论是将它存储于某地,还是通过网络传送,这种抽取动作称为“将一个对象序列化”,而反向处理过程,从一个被序列化的状态重建一个对象即为反序列化. ...

  3. 基础命名空间:序列化_自定义序列化 System.Runtime.Serialization

    (  (From Msdn) 自定义序列化是控制类型的序列化和反序列化的过程,通过控制序列化,可以确保序列化兼容性.换而言之,在不中断类型核心功能的情况下,可在类型的不同版本之间序列化和反序列化. 重 ...

  4. 【转】C# XML序列化去掉XML默认的命名空间及声明头

    http://blog.csdn.net/aoshilang2249/article/details/44860155 重点: XmlSerializerNamespaces namespaces = ...

  5. [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类

    [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...

  6. XML序列化和反序列化

    上篇总结了下JSON的序列化和反序列化,博园中大牛给了很多牛叉的评论,学习了不少. 不过在上篇中忘了把json序列化和反序列化的另外一种方式写上去了,这里做个简单的补充: Json篇:http://w ...

  7. 【转】Xml序列化

    XML序列化是将对象的公共属性和字段转换为XML格式,以便存储或传输的过程.反序列化则是从XML输出中重新创建原始状态的对象.XML序列化中最主要的类是XmlSerializer类.它的最重要的方法是 ...

  8. .net学习笔记---xml序列化

    XML序列化是将对象的公共属性和字段转换为XML格式,以便存储或传输的过程.反序列化则是从XML输出中重新创建原始状态的对象.XML序列化中最主要的类是XmlSerializer类.它的最重要的方法是 ...

  9. .NET(C#):XML序列化时派生类的处理

    原文 www.cnblogs.com/mgen/archive/2011/12/03/2275014.html 目录 1. 针对基类的XmlSerializer序列化派生类 2. 类内成员是派生类的序 ...

随机推荐

  1. POJ 1577 Falling Leaves 二叉搜索树

    HDU 3791 Falling Leaves 二叉搜索树  Figure 1Figure 1 shows a graphical representation of a binary tree of ...

  2. 图像RGB2YUV与YUV2RGB格式互转介绍

    1 YUV格式与RGB格式说明 由于不同国家的电视信号系统支持的图像格式不同,有YUV格式成像,也有RGB格式成像,因此为了保证兼容性,需要进行RGB与YUV格式的互转. 另外YUV格式具有亮度信息和 ...

  3. 【LeetCode题解】530_二分搜索树的最小绝对值差

    目录 [LeetCode题解]530_二分搜索树的最小绝对值差 描述 方法一.中序遍历二分搜索树 思路 Java 代码 Python 代码 [LeetCode题解]530_二分搜索树的最小绝对值差 描 ...

  4. xml布局中include的使用

    参考:http://blog.csdn.net/harvic880925/article/details/17263275 include_button1.xml <?xml version=& ...

  5. 利用jquery的ajax实现跨域,内部其实是jsonp协议了,不是XHRhttp协议

    一.同源策略 要理解跨域,先要了解一下“同源策略”.所谓同源是指,域名,协议,端口相同.所谓“同源策略“,简单的说就是基于安全考虑,当前域不能访问其他域的东西. 一些常见的是否同源示例可参照下表: 在 ...

  6. SQL Serever学习13——数据库编程语言

    编程基础 注释 注释命名来对一些语句进行说明,便于日后维护或者其他用户理解,注释不会执行. 单行注释 SELECT GETDATE() --查询当前日期 多行注释 /* 注释有助于 理解操作的内容 查 ...

  7. JavaScript迭代

    定义: 指的是按照某种顺序逐个访问列表中的每一项. 迭代在数学中的定义: 在循环的基础上, 每一次循环, 都比上一次更为接近结果. 循环定义:指的是在满足条件的情况下,重复执行同一段代码. 迭代方法: ...

  8. [javaSE] IO流(管道流)

    之前我们使用io流,都是需要一个中间数组,管道流可以直接输入流对接输出流,一般和多线程配合使用,当读取流中没数据时会阻塞当前的线程,对其他线程没有影响 定义一个类Read实现Runable接口,实现r ...

  9. kinect 深度图像去噪算法

    算法设计思路 (1)读取16位深度图像到待处理图像帧组: (2)ROI区域计算 由于kinect 彩色摄像头和红外深度摄像头是存在视角偏差的,经过视角对齐后,得到的深度图像是有黑边的.此处通过取帧组第 ...

  10. 网络安全之——DNS欺骗实验

        ---------------发个帖证明一下存在感,希望各位大牛们,别喷我!!谢谢--------------         DNS(域名系统)的作用是把网络地址(域名,以一个字符串的形式) ...