序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。
.NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。    可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。

1.BinaryFormatter 
命名空间:System.Runtime.Serialization.Formatters.Binary;
下面先定义一个可序列化类:

[Serializable] //表示该类可被序列化
class Peoson {
public Peoson() { }
public Peoson(string name, int age)
{
this.name = name;
this.age = age;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
[NonSerialized] //表示下面这个age字段不进行序列化
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public void SayHi()
{
Console.WriteLine("大家好,我是{0},今年{1}岁",name,age);
}
}

Main函数中:

List<Peoson> listPers = new List<Peoson>();
Peoson per1 = new Peoson("张三", 18);
Peoson per2 = new Peoson("李四", 20);
listPers.Add(per1);
listPers.Add(per2);
SerializeMethod(listPers);
//ReserializeMethod(); //反序列化成把上面一行注释掉 执行此行
Console.ReadKey();

序列化和反序列化的方法:

static void ReserializeMethod()
{
//反序列化
using (FileStream fs = new FileStream("1.bin", FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
List<Peoson> list = bf.Deserialize(fs) as List<Peoson>;
if (list != null)
{
for (int i = 0; i < list.Count; i++)
{
list[i].SayHi();
}
}
}
}
static void SerializeMethod(List<Peoson> listPers)
{
//序列化
using (FileStream fs = new FileStream("1.bin", FileMode.Create))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, listPers);
}
}
}

反序列化输出结果:

大家好,我是张三,今年0岁

大家好,我是李四,今年0岁

由此看出,未序列化的字段存储的值为空。

2、使用XmlSerializer进行串行化

    关于格式化器还有一个问题,假设我们需要 XML,有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用 库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。

    如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:

    a.添加System.Xml.Serialization命名空间。

    b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized类似。

    c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。

序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));

xs.Serialize(fs, listPers);

反序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));

List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;

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

  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. IP欺骗使用

    一.为什么要设置IP欺骗 1. 当某个IP的访问过于频繁,或者访问量过大时,服务器会拒绝访问请求,这时候通过IP欺骗可以增加访问频率和访问量,以达到压力测试的效果. 2. 某些服务器配置了负载均衡,使 ...

  2. LNK2005 连接错误解决办法

    nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@ ...

  3. HDOJ 1878 欧拉回路 nyoj 42一笔画问题

    #include<cstdio> #include<cstring> ]; int find(int x) { if(visited[x]!=x) return find(vi ...

  4. 【Python】Django 聚合 Count与Sum用法,注意点

    代码示例: from django.db.models import Sum, Count #alarm_sum_group_items = models.FILE_PROTECT_ALARM.obj ...

  5. Compare Strings

    Compare two strings A and B, determine whether A contains all of the characters in B. The characters ...

  6. 取出type="button" 和type="text" 里面的值显示在页面

    <script  type="text/JavaScript> function changeLink() { document.getElementById("nod ...

  7. JAVA接口继承、抽象类等

    1.定义接口 package test.intefaces; public interface TestIntefaceA { void testA(); void testB(); void tes ...

  8. js init : function ()

    这个init外面应该还有一层,比如 var a = { init: function () {...}, exit: function () {...} } 这样的话,可以用a.init()来调用这个 ...

  9. 21.左旋转字符串[LeftRotateString]

    [题目] 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部.如把字符串AB1234 左旋转2位得到字符串1234AB.请实现字符串左旋转的函数.要求时间对长度为n的字符串操作的复杂度 ...

  10. 18.用两个栈实现队列[2StacksToImplementQueue]

    [题目] 某队列的声明如下:  C++ Code  123456789101112131415   template<typename T> class CQueue { public: ...