.net序列化
在开发过程中,会遇到很多需要使用序列化的场景,比如wcf,webservice或者jquery+.net等。那今天就说说我对序列化的理解。
在.net中有几种序列化的方式,XML、二进制、SOAP、还有JSON。
XML序列化
xml序列化是使用namespace:System.Xml.Serialization下的class:XmlSerializer实现的。序列化之后使用xml格式的。
现有类型
1: [XmlRoot("OnlineOrder")]
2: public class Order
3: {
4: private int orderId;
5:
6: public int OrderId
7: {
8: get { return orderId; }
9: set { orderId = value; }
10: }
11: private DateTime orderTime;
12:
13: [XmlAttribute("OrderServerTime")]
14: public DateTime OrderTime
15: {
16: get { return orderTime; }
17: set { orderTime = value; }
18: }
19:
20: private List<Product> product;
21: public List<Product> Product
22: {
23: get { return product; }
24: set { product = value; }
25: }
26: }
27: public class Product
28: {
29: private int productId;
30:
31: public int ProductId
32: {
33: get { return productId; }
34: set { productId = value; }
35: }
36: private string productName;
37:
38: public string ProductName
39: {
40: get { return productName; }
41: set { productName = value; }
42: }
43:
44:
45: private string productShortName;
46:
47: public string ProductShortName
48: {
49: get { return productShortName; }
50: set { productShortName = value; }
51: }
52: }
53:
执行序列化
1: Order order = new Order
2: {
3: Product = new List<Product>() { new Product() { ProductId = 1, ProductName = "ipone4", ProductShortName = "ip4" } },
4: OrderId = 1001,
5: OrderTime = DateTime.Now
6: };
7:
8: System.IO.StreamWriter writer = new System.IO.StreamWriter("xml.xml");
9:
10: XmlSerializer serializer = new XmlSerializer(typeof(Order));
11: serializer.Serialize(writer, order);
12:
现在可以看看结果了。
<?xml version="1.0" encoding="UTF-8"?>
-<OnlineOrder OrderServerTime="2013-10-27T10:59:49.451353+08:00" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><OrderId>1001</OrderId>-<Product>-<Product><ProductId>1</ProductId><ProductName>ipone4</ProductName><ProductShortName>ip4</ProductShortName></Product></Product></OnlineOrder>
之后修改代码
1:
2: public class Order
3: {
4: private int a = 1;
5: protected int b = 2;
6: public int c = 3;
7: protected int d { get; set; }
8: private int orderId;
9:
10: public int OrderId
11: {
12: get { return orderId; }
13: set { orderId = value; }
14: }
15: private DateTime orderTime;
16:
17: [XmlIgnore]
18: public DateTime OrderTime
19: {
20: get { return orderTime; }
21: set { orderTime = value; }
22: }
23:
24: private List<Product> product;
25: public List<Product> Product
26: {
27: get { return product; }
28: set { product = value; }
29: }
30: }
31: public class Product
32: {
33: private int productId;
34:
35: public int ProductId
36: {
37: get { return productId; }
38: set { productId = value; }
39: }
40: private string productName;
41:
42: public string ProductName
43: {
44: get { return productName; }
45: set { productName = value; }
46: }
47:
48:
49: private string productShortName;
50:
51: public string ProductShortName
52: {
53: get { return productShortName; }
54: set { productShortName = value; }
55: }
56: }
再次查看结果
<?xml version="1.0" encoding="UTF-8"?>
-<Order xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><c>3</c><OrderId>1001</OrderId>-<Product>-<Product><ProductId>1</ProductId><ProductName>ipone4</ProductName><ProductShortName>ip4</ProductShortName></Product></Product></Order>
对比结果可以看出
1:可以使用一些attribute来改变制定property序列化之后的形式。
2:private\protect字段不会序列化,也可以说可以被外部读写的字段属性会被序列化。
3:需要使用默认的构造函数,原理类似第二条。
4:XmlIgnore attribute之后不会序列化。
二进制序列化
二进制序列化使用的是namespace:System.Runtime.Serialization.Formatters下的class:Binary实现的
同样使用类似的代码
1: [Serializable]
2: public class Order
3: {
4: private int a = 1;
5: protected int b = 2;
6: public int c = 3;
7: protected int d { get; set; }
8: private int orderId;
9:
10: public int OrderId
11: {
12: get { return orderId; }
13: set { orderId = value; }
14: }
15: private DateTime orderTime;
16:
17: public DateTime OrderTime
18: {
19: get { return orderTime; }
20: set { orderTime = value; }
21: }
22:
23: private List<Product> product;
24: public List<Product> Product
25: {
26: get { return product; }
27: set { product = value; }
28: }
29: }
30: [Serializable]
31: public class Product
32: {
33: private int productId;
34:
35:
36: public int ProductId
37: {
38: get { return productId; }
39: set { productId = value; }
40: }
41: private string productName;
42:
43: public string ProductName
44: {
45: get { return productName; }
46: set { productName = value; }
47: }
48:
49:
50: private string productShortName;
51:
52: public string ProductShortName
53: {
54: get { return productShortName; }
55: set { productShortName = value; }
56: }
序列化和反序列化:
1: Order order = new Order
2: {
3: Product = new List<Product>() { new Product() { ProductId = 1, ProductName = "ipone4", ProductShortName = "ip4" } },
4: OrderId = 1001,
5: OrderTime = DateTime.Now
6: };
7:
8: using (System.IO.FileStream fs = new System.IO.FileStream("xx.xml", System.IO.FileMode.OpenOrCreate))
9: {
10: BinaryFormatter bf = new BinaryFormatter();
11: bf.Serialize(fs, order);
12: }
13: using (System.IO.FileStream fs = new System.IO.FileStream("xx.xml", System.IO.FileMode.OpenOrCreate))
14: {
15: BinaryFormatter bf = new BinaryFormatter();
16: Order order1 = (Order)bf.Deserialize(fs);
17: }
查看结果:

看来所有的属性和字段都被序列化了。
看来,二进制序列化和XML序列化还是稍显不同的。
------未完待续-----
.net序列化的更多相关文章
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- 【.net 深呼吸】设置序列化中的最大数据量
欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...
- 用dubbo时遇到的一个序列化的坑
首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...
- Unity 序列化
Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...
- Unity 序列化 总结
查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http:// ...
- [C#] C# 知识回顾 - 序列化
C# 知识回顾 - 序列化 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902005.html 目录 序列化的含义 通过序列化保存对象数据 众 ...
- Newtonsoft.Json设置类的属性不序列化
参考页面: http://www.yuanjiaocheng.net/webapi/parameter-binding.html http://www.yuanjiaocheng.net/webapi ...
- C# 序列化与反序列化几种格式的转换
这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
- .Net深入实战系列—JSON序列化那点事儿
序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...
随机推荐
- nyoj17-单调递增最长子序列-(dp)
17-单调递增最长子序列 内存限制:64MB 时间限制:3000ms 特判: No通过数:125 提交数:259 难度:4 题目描述: 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列 ...
- putty 链接亚马逊服务器
使用 PuTTY 从 Windows 连接到亚马逊云的 Linux 实例 转载 2016年07月22日 14:09:47 使用 PuTTY 从 Windows 连接到亚马逊云的 Linux 实例 ...
- numpy 矩阵变换 reshape ravel flatten
1. 两者的区别在于返回拷贝(copy)还是返回视图(view),numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响(reflects)原始矩阵,而numpy.ravel()返回的是 ...
- Error:Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]
原文博客链接:https://blog.csdn.net/chniccs/article/details/51258972 在创建fragment时,你可能在打包时碰到如下错误 Error:Error ...
- Shiro在Spring session管理
会话管理 在shiro里面可以发现所有的用户的会话信息都会由Shiro来进行控制,那么也就是说只要是与用户有关的一切的处理信息操作都可以通过Shiro取得,实际上可以取得的信息可以有用户名.主机名称等 ...
- 1.5.2、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用内部包存储库)
本主题描述如何在Cloudera Manager部署中创建内部包存储库和直接主机以使用该存储库.您可以创建永久或临时存储库. 完成这些步骤后,您可以安装特定版本的Cloudera Manager或在未 ...
- 【scrapy】爬虫的时候总在提示 KeyError: 'novelLabel'
调试的时候总是提示 KeyError: 'novelLabel'然后决定断点调试一下, 在def parse_book_list(self, response):方法下,添加print(respons ...
- pyinstaller linux系统下打包python源文件
将python程序放在其他linux服务器中执行,通常linux服务器中默认安装python2.6,很多情况下需要升级为2.7 且要安装程序中需要的第三方模块,配置较为麻烦,所以通过在本地linux ...
- df.dropna()函数和df.ix(),df.at(),df.loc()
- stable
stable - 必应词典 美['steɪb(ə)l]英['steɪb(ə)l] n.马厩:马房:(养马作特定用途的)养马场 adj.稳定的:稳固的:牢固的:稳重的 v.使(马)入厩:把(马)拴在马厩 ...