在开发过程中,会遇到很多需要使用序列化的场景,比如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序列化的更多相关文章

  1. 【.net 深呼吸】序列化中的“引用保留”

    假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...

  2. 【.net 深呼吸】设置序列化中的最大数据量

    欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...

  3. 用dubbo时遇到的一个序列化的坑

    首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...

  4. Unity 序列化

    Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...

  5. Unity 序列化 总结

    查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http:// ...

  6. [C#] C# 知识回顾 - 序列化

    C# 知识回顾 -  序列化 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902005.html 目录 序列化的含义 通过序列化保存对象数据 众 ...

  7. Newtonsoft.Json设置类的属性不序列化

    参考页面: http://www.yuanjiaocheng.net/webapi/parameter-binding.html http://www.yuanjiaocheng.net/webapi ...

  8. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

  9. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  10. .Net深入实战系列—JSON序列化那点事儿

    序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...

随机推荐

  1. 使用qt creator4.XXX,b编辑和调试caffe,太好用了

    一直想看caffe的源代码,网上看了一个qt的例子,但是自己也有qt creator,怎么就不行 后面发现是自己的版本太低所以不好用(可能是自己能力有限) 可以参考下面这个链接: 使用qt creat ...

  2. <assert.h>库学习

    assert的初步认识 assert宏指令是用来诊断程序是否有误的,函数原型如下 void assert(int expression) 那为什么我们要使用assert而不用printf呢?因为ass ...

  3. mysql 拼接字符

    Mysql的查询结果行字段拼接,可以用下面两个函数实现: 1. concat函数 mysql> select concat('1','2','3') from test ; +--------- ...

  4. Dubbo -- Simple Monitor

    一.简介 dubbo-monitor-simple是dubbo提供的简单监控中心,可以用来显示接口暴露,注册情况,也可以看接口的调用明细,调用时间等. Simple Monitor挂掉不会影响到Con ...

  5. php支付宝接口 的使用

    下载地址(java/php都有) https://doc.open.alipay.com/doc2/detail?treeId=66&articleId=103571&docType= ...

  6. metasploit framework(三):exploit模块

    exploit模块 分为主动,被动exploit 主动exploit:攻击者(通常是客户端)主动发起连接请求,然后发送exploit给被攻击者(通常是服务器端) 被动exploit:被攻击者(通常是客 ...

  7. MyEclipse2014安装aptana插件

    1. 2. aptana插件下载地址 链接: https://pan.baidu.com/s/1sloiAK1 密码: a1nh 3. 4. 确认是否安装成功

  8. Django model 中的 class Meta 详解

    Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...

  9. zabbix 自定义监控 排除带报错提示

    UserParameter=lq_data_sqoop,/usr/local/bin/sqoop.sh  2>/dev/null |awk '{print $2}' 注意:2>/dev/n ...

  10. CUDA error 100 & Decoder not initialized

    项目中用cuda解码时候遇到该错误,这是调用cuda相关库中一些so库版本错误造成的.