C#实现XML序列化与反序列化
作者:springsnow 发布时间:2022-10-06 19:50:21
标签:C#,XML,序列化,反序列化
一、使用 System.Xml.Serialization类
1、定义元数据
引入System.Xml.Serialization命名空间。
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; }
}
2、简单序列化与反序列化
//序列化
Product product = new Product() { ProductID = 1, DisCount = 5 };
string s = "";
using (StringWriter sw = new StringWriter())
{
XmlSerializer xz = new XmlSerializer(typeof(Product));
xz.Serialize(sw, product);
s = sw.ToString();
}
Console.WriteLine(s);
//
// Discount="5">
// 1
//
//反序列化
using (StringReader sr = new StringReader(s))
{
XmlSerializer xz = new XmlSerializer(typeof(Product));
product = xz.Deserialize(sr) as Product;
}
Console.WriteLine(product .ProductID.ToString() + ", " + product.DisCount); //1, 5
3、集合的序列化与反序列化
//序列化
List list = new List(){
new Product() { ProductID = 1, DisCount =5 },
new BookProduct() { ProductID = 1, DisCount =3, 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);
//
//
// <allpro>
// <prod Discount="5">
// 1
//
// <book Discount="3">
// 1
// aaaa
//
// allpro>
//
//反序列化
using (StringReader sr = new StringReader(s))
{
XmlSerializer xz = new XmlSerializer(typeof(Inventory));
invertoy = xz.Deserialize(sr) as Inventory;
}
Console.WriteLine(invertoy.InventroyItems[0].ProductID.ToString() + ", " + invertoy.InventroyItems[0].DisCount); //1, 5
4、在不能更改数据的情况下,可以用代码重载 XmlAttributeOverrides
List list = new List(){
new Product() { ProductID = 1, DisCount =5 },
new BookProduct() { ProductID = 1, DisCount =3, ISBN="aaaa"}
};
Inventory invertoy = new Inventory { InventroyItems = list.ToArray() };
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);
//
//http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
// <product1 Discount="5">
// 1
//
// <book1 Discount="3">
// 1
// aaaa
//
//
//反序列化
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[0].ProductID.ToString() + ", " + invertoy.InventroyItems[0].DisCount); //1, 5
5、通用类
void Main()
{
//序列化
Product product = new Product() { ProductID = 1, DisCount = 5 };
string s = UserQuery.SimpleSerializer.Serialize(product);
Console.WriteLine(s);
//反序列化
product = UserQuery.SimpleSerializer.Deserialize(typeof(UserQuery.Product), s);
Console.WriteLine(product.ProductID.ToString() + ", " + product.DisCount); //1, 5
}
public class SimpleSerializer
{
///
/// 序列化对象
///
/// 对象类型
/// 对象
///
public static string Serialize(T t)
{
using (StringWriter sw = new StringWriter())
{
XmlSerializer xz = new XmlSerializer(t.GetType());
xz.Serialize(sw, t);
return sw.ToString();
}
}
///
/// 反序列化为对象
///
/// 对象类型
/// 对象序列化后的Xml字符串
///
public static T Deserialize(Type type, string s) where T : class
{
using (StringReader sr = new StringReader(s))
{
XmlSerializer xz = new XmlSerializer(type);
return xz.Deserialize(sr) as T;
}
}
}
二、用DataContractSerialize类序列化XML
1、层次结构
基类:XmlObjectSerializer
派生类:
DataContractSerializer
NetDataContractSerializer
DataContractJsonSerializer
需要引入的程序集:
System.Runtime.Serialization.dll
System.Runtime.Serialization.Primitives.dll
2、实体类
//订单类
[DataContract(Name = "order", Namespace = "http://a/order")]
//[KnownType(typeof(order))]
public class Order
{
public Order(Guid id, Product product)
{
this.OrderID = id;
this.Product = product;
}
[DataMember(Name = "id", Order = 2)]
public Guid OrderID { set; get; }
[DataMember]
public Product Product { set; get; }
}
//产品类
[DataContract(Name = "product", Namespace = "http://a/product")] //IsRequired=false,EmitDefaultValue=false
public class Product
{
public Product(Guid id, string productArea)
{
this.ProductID = id;
this.productArea = productArea;
}
[DataMember(Name = "id", Order = 1)]
public Guid ProductID { set; get; }
[DataMember]
private string productArea { set; get; } //私有属性也可以序列化。
}
3、序列化与反序列化
Product product = new Product(Guid.NewGuid(), "XiaMen");
Order order = new Order(Guid.NewGuid(), product);
string filename = @"C:\s.xml";
using (FileStream fs = new FileStream(filename, FileMode.Create))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(Order));
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs))
{
serializer.WriteObject(writer, order);
}
}
Process.Start(filename);
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(Order));
using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()))
{
order = serializer.ReadObject(reader) as Order;
}
}
得到的XML内容
<xml version="1.0" encoding="utf-8"?>
<order xmlns="http://a/order" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Product xmlns:a="http://a/product">
<a:productArea>XiaMen</a:productArea>
<a:id>d3b4c977-d052-4fd4-8f59-272e56d875a8</a:id>
</Product>
<id>96d0bb44-cee4-41b6-ae20-5d801c1b3dc9</id>
</order>
来源:https://www.cnblogs.com/springsnow/p/12884534.html


猜你喜欢
- DataBindings属性是很多控件都有的属性,作用有2方面。一方面是用于与数据库的数据进行绑定,进行数据显示。另一方面用于与控件或类的对
- 最开始接触到相关的内容应该是从volatile关键字开始的吧,知道它可以保证变量的可见性,而且利用它可以实现读与写的原子操作。。。但是要实现
- 一.以springboot为例,建立代码1.IExecCommandServer:public interface IExecCommand
- 前言最近在维护一个运营端的系统,和前端联调的过程中,经常需要排查一些交互上的问题,每次都得看前端代码的传参和后端代码的出参,于是打算给HTT
- 想要php版的朋友可以到这里下载测试 https://www.jb51.net/codes/83179.htmlimport java.io
- 这篇文章主要介绍了spring boot 2整合swagger-ui过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 现在很多Android应用在首次安装完都会有指引如何使用该应用的某些功能的指引界面,这样会获得很好的用户体验,能够帮助用户更好使用应用的某些
- 意义:由于每个应用进程都有自己的独立进程空间,在android平台上,一个进程通常不能访问另一个进程的内存空间,而我们经常需要夸进程传递对象
- using System;using System.Collections.Generic;using System.ComponentMo
- 本文实例为大家分享了java实现扫雷游戏入门程序的具体代码,供大家参考,具体内容如下分析:1.首先布一个10*10的雷阵,即二维数组map,
- 目录Shiro简介Shiro快速入门SpringBoot-Shiro整合(最后会附上完整代码)附上最后的完整代码Shiro整合mybatis
- 在VF、VB、PB的应用中,有些无法通过语言工具本身来完成的或者做得不理想的功能,我们会考虑通过Windows的API来完成。在那个年代,熟
- 0.简介GridView 和 ListView 有共同的父类:AbsListView,因此 GridView 和 ListView 具有一定
- 添加Hibernate配置文件提示 解压hibernate.jar包 在org\hibernate目录下找到hibernate-config
- 本文实例为大家分享了Android实现Window弹窗效果的具体代码,供大家参考,具体内容如下效果图第一步 准备弹窗的布局,新建XML文件
- 1. Vscode安装Visual studio code是微软发布的一个运行于 Mac OS X、Windows和 Linux 之上的,针
- 前言最近做了个滑动选择的小控件,拿出来给大家分享一下,先上图运行效果实现步骤这里分解为3个动作:Down、Move、Up来进行分析,博主文采
- 本文实例为大家分享了Android倒计时进度条展示的具体代码,供大家参考,具体内容如下效果预览源代码传送门:https://github.c
- 由于公司平台访问人数逐渐增多,公司项目的数据库已经几次出现宕机现象。为减轻数据库压力,我上个月对公司项目做了下调整。把新闻板块提取出来单独一
- 之前封装过一个,但总觉得不够优雅,就有了这个通用封装,很简洁,不知道够不够优雅,不过原来那个有跟随指示器和丝滑滑动效果,感兴趣可以看一下。封