序列化是将对象的状态信息转换为可保持或传输的格式的过程(一堆字符),比如转化为二进制、xml、json等的过程。

反序列化就是将在序列化过程中所生成的二进制串、xml、json等转换成数据结构或者对象的过程。

这两个过程结合起来,可以轻松地存储、传输数据。

最主要的作用有:

  • 在进程下次启动时读取上次保存的对象的信息
  • 在不同的AppDomain或进程之间传递数据
  • 在分布式应用系统中传递数据序列化,其实就是将对象的状态信息转换为可以存储或传输的数据形式

比如有这样一个类
class User{
public string UserName;
public string Password;
}
我们可以把它的实例转换为这样的xml
<User>
<UserName>value</UserName>
<Password>value</Password>
</User>
可以认为这样就是序列化。

XML序列化和反序列化

对象序列化之后的结果是XML形式的,通过XmlSerializer 类来实现的,这个类位于System.Xml.Serialization命名空间下。XML序列化不能序列化私有数据。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization; namespace ConsoleApplication1
{
public class Person
{
public string Name;//姓名
public bool Sex;//性别,是否是男
public Person() { }//必须提供无参构造器,否则XmlSerializer将出错
public Person(string name, bool sex)
{
this.Name = name;
this.Sex = sex;
} public override string ToString()
{
return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");
}
} public class Programmer : Person
{ public string Language;//编程语言
public Programmer() { }//必须提供无参构造器,否则XmlSerializer将出错
public Programmer(string name, bool sex, string language)
: base(name, sex)//base关键字用于从派生类中访问基类成员
{
this.Language = language;
} public override string ToString()
{
return base.ToString() + "\t编程语言:" + this.Language;
}
} class Program
{
static void Main(string[] args)
{
//创建Programmer列表,并添加对象
List<Programmer> list = new List<Programmer>();
list.Add(new Programmer("李志伟", true, "C#"));
list.Add(new Programmer("Coder2", false, "C++"));
list.Add(new Programmer("Coder3", true, "Java"));
//System.Reflection.PropertyInfo[] properties = list.GetType().GetProperties();//反射获取对象的属性
//使用XML序列化对象
string fileName = @"C:\Users\chris_gu\Desktop\Programmers.xml";//文件名称与路径
Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
XmlSerializer xmlFormat = new XmlSerializer(typeof(List<Programmer>), new Type[] { typeof(Programmer), typeof(Person) });//创建XML序列化器,需要指定对象的类型
xmlFormat.Serialize(fStream, list); //使用XML反序列化对象 fStream.Position = ;//重置流位置
list.Clear();
list = (List<Programmer>)xmlFormat.Deserialize(fStream);
foreach (Programmer p in list)
{
Console.WriteLine(p);
}
Console.Read();
}
}
}

Json序列化

第一种:使用JavaScriptSerializer类,适用Web平台

C#将对象序列化成JSON字符串

using System.Web.Script;
using System.Web.Script.Serialization;
            JavaScriptSerializer serializer = new JavaScriptSerializer();
foreach (DataRow dr in dt.Rows)
{
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("Dev_NO", dr["Dev_NO"].ToString());
data.Add("Dev_Name", dr["Dev_Name"].ToString());
data.Add("Ol_Phone", dr["Ol_Phone"].ToString());
data.Add("Ol_IP", dr["Ol_IP"].ToString());
data.Add("Ol_Status", dr["Ol_Status"].ToString());
list.Add(data);
}
Response.Write(serializer.Serialize(list));

输出结果为:

[{"Dev_NO":"","Dev_Name":"test","Ol_Phone":"","Ol_IP":"10.196.209.174","Ol_Status":""},{"Dev_NO":"000F0000","Dev_Name":"test_hzlkhq","Ol_Phone":"","Ol_IP":"192.168.1.198","Ol_Status":""}]

如何将Json字符串转换成对象使用呢?

    public class Model
{
public string Dev_NO { get; set; }
public string Dev_Name { get; set; }
public string Ol_Phone { get; set; }
public string Ol_IP { get; set; }
public int Ol_Status { get; set; }
}
    string requestMes="[{\"Dev_NO\":\"00066666\",\"Dev_Name\":\"test\",\"Ol_Phone\":\"13766668888\",\"Ol_IP\":\"10.196.209.174\",\"Ol_Status\":\"2\"},{\"Dev_NO\":\"000F0000\",\"Dev_Name\":\"test_hzlkhq\",\"Ol_Phone\":\"13066668888\",\"Ol_IP\":\"192.168.1.198\",\"Ol_Status\":\"2\"}]";
JavaScriptSerializer serializer = new JavaScriptSerializer();
var Json = serializer.Deserialize<List<Model>>(requestMes);

第二种使用DataContractJsonSerializer,适用通用平台

using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
public class Model
{
public string Dev_NO { get; set; }
public string Dev_Name { get; set; }
public string Ol_Phone { get; set; }
public string Ol_IP { get; set; }
public int Ol_Status { get; set; }
} public class Test
{
public static DataTable getData()
{
var a = "{\"Dev_NO\":\"00066666\",\"Dev_Name\":\"test\",\"Ol_Phone\":\"13766668888\",\"Ol_IP\":\"10.196.209.174\",\"Ol_Status\":\"2\"}";
var serializer = new DataContractJsonSerializer(typeof(List<DTUModel>));
var mStream = new MemoryStream(Encoding.UTF8.GetBytes(a.ToString()));
List<DTUModel> list = (List<DTUModel>)serializer.ReadObject(mStream);
DataTable dt = new DataTable();
return dt;
}
}

C# 序列化(Serialize)与反序列化(Deserialize)的更多相关文章

  1. 【转】【C#】序列化(Serialize)、反序列化(Deserialize)

    序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种串行化的方式: 1. ...

  2. 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)

    序列化概述: 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象 ...

  3. 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)(转)

    序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方.    .NET框架提供了两种串行化的方式: ...

  4. 【MFC】序列化(Serialize)、反序列化(Deserialize)

    1.首先在头文件里面声明 DECLARE_SERIAL(CSelectionSerial) 2.重写CObject的Serialize函数 virtual void Serialize(CArchiv ...

  5. 序列化serialize()与反序列化unserialize()的实例

    在写序列化serialize与反序列化unserialize()时,我们先来看看: serialize - 产生一个可存储的值的表示 描述 string serialize ( mixed $valu ...

  6. 【PHP基础】序列化serialize()与反序列化unserialize()

    序列化serialize()与反序列化unserialize(): 序列化serialize():就是将一个变量所代表的 “内存数据”转换为“字符串”的形式,并持久保存在硬盘(写入文件中保存)上的一种 ...

  7. 文件读取的时候要留意 -- 序列化serialize()与反序列化unserialize():

    原文:https://blog.csdn.net/little_rabbit_baby/article/details/53840543 序列化serialize()与反序列化unserialize( ...

  8. C#—序列化(Serialize)和反序列化(NonSerialize)

    (转自:http://www.cnblogs.com/Abel-Zhang/p/Serialize.html) 一.概述 序列化是把对象转变成流.相反的过程就是反序列化. 哪些场合用到这项技术呢? 1 ...

  9. 序列化serialize与反序列化unserialize

    有利于存储和传递value(除了resource类型外),却不会丢失其原有类型和结构. serialize序列化时会调用魔术方法__sleep(); unserialize反序列化时会调用魔术方法__ ...

  10. PHP序列化serialize()和反序列化unserialize()

    所谓的序列化,就是把保存在内存中的各种对象状态或属性保存起来,在需要时可以还原出来. serialize() 可处理除了 resource 之外的任何类型返回字符串,此字符串包含了表示 value 的 ...

随机推荐

  1. 三、K3 WISE 开发插件《K3 WISE开发手册》

    1.VB插件工程的命名.命名空间和生成的DLL命名要一致,否则导致注册不成功! 2.主控台的查询分析工具,添加sql直接报表,代码用到临时表,提示“在对应所需名称或序数的集合中未找到项目” 解决:在代 ...

  2. 【大数据系列】windows环境下搭建hadoop开发环境使用api进行基本操作

    前言 搭建完hadoop集群之后在windows环境下搭建java项目进行测试 操作hdfs中的文件 版本一 package com.slp.hadoop274.hdfs; import java.i ...

  3. 原生js(一)

    Element对象有以下重要属性: 1.style. a) Element的css样式 b) 可以通过elem.style.backgroundColor = "red"的形式才动 ...

  4. 注意@ Override不同版本的区别

    @Override注解用于方法的覆写上,它在编译期有效,也就是Java编译器在编译时会根据该注解检查是否真的是覆写,如果不是就报错,拒绝编译. 该注解很大程度解决我们的误写问题,比如子类和父类的方法名 ...

  5. 第二步 (仅供参考) sencha touch + PhoneGap(cordova 2.9 及其以下版本) 使用 adt eclipse进行打包

    首先你得安装一个adt-eclipse 参考资料 http://www.crifan.com/android_eclipse_offline_install_adt/ 然后就可以运行adt-eclip ...

  6. 一个简单web系统的接口性能分析及调优过程

    在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[root@local ...

  7. windows10 自带笔记本键盘禁止和开启

    管理员打开cmd,输入sc config i8042prt start= disabled 然后重启就好了,注意 =后面有个空格. 恢复:sc config i8042prt start= deman ...

  8. vue--父子组件的传值

    什么是父子组件? 组件中引入组件,被引入的组件就是子组件.例如在 Hello.vue 组件中引入 Header.vue 组件,那么 Hello.vue 就是父组件,Header.vue就是子组件. 一 ...

  9. css层叠样式优先级总结

    虽然学前端最刚开始就是html+css,一直因为这些看起来太简单就没有什么总结,不过看似很简单的东西,研究起来也深不可测,问起来js可能回答的头头是道,css这么简单的东西,其中一个优先级的问题就能难 ...

  10. scala - fold,aggregate,iterator

    import org.json4s._ import org.json4s.jackson._ import org.json4s.jackson.JsonMethods._ import org.j ...