[笔记]序列化与反序列化的讨论(一)

原创 2007年09月24日 16:34:00

序列化:当我们需要将某个值(或者类)存储在某个媒介上或者进行传输,其中一个办法就是对其进行序列化。序列化将生成一个二进制流,根据不同的情况,这个流可以定位到文件或者网络流。

反序列化:当我们获得一个流以后,需要从这个流中把原来的值(或者类)精确地还原,就称为反序列化。 

概念太枯燥了,用一些例子可能更好理解

单个类的序列化和反序列化

喜欢玩游戏的都知道,每一个游戏都有存盘文件,上面记录了我们的心血。这个存盘文件,实际上就是一个序列化过的二进制文件。我们来看看游戏是如何做的。玩家选择存盘,首先,游戏中的数据就会放到一个类中,然后,对这个类使用序列化,这个类中的所有信息,就会被依次序列化到文件中。当我们读取游戏进度的时候则刚好相反,是从游戏存盘文件获得二进制流,然后根据这个二进制流来还原本来的数据,来达到读取进度的目的,这就是反序列化。 

[Serializable]
public class Player
...{
public string Name;
public uint Level;
public uint Hp;
public uint HpMax;
public uint Mp;
public uint MpMax;
public uint Exp;
public uint ExpMax;
}


[Serializable]
public class Item
...{
public ushort ItemCode;
public string Name;
public string Description;
public uint Quantity;
}


[Serializable]
public class SaveData
...{
public Player player;
public Item[] items;

// 序列化方法
public static void Save(SaveData sav)
...{
IFormatter formatter 
= new BinaryFormatter();
Stream s 
= new FileStream (@"D:Save.dat",FileMode.Create,
FileAccess.Write, FileShare.None);

// 开始序列化
formatter.Serialize(s, sav);
s.Close();
s.Dispose();
}


// 反序列化方法
public static SaveData Load()
...{
BinaryFormatter formatter 
= new BinaryFormatter();
Stream s 
= new FileStream(@"D:Save.dat", FileMode.Open, 
FileAccess.Read, FileShare.None);
SaveData sav 
= (SaveData)formatter.Deserialize(s);
s.Close();
s.Dispose();
return sav;
}

}

在.NET环境下,每一个允许被序列化的类和方法,必须加上[Serializable]字样。表示该类允许被序列化,如果其中一个没有加,就会抛出SerializationException的异常。

有时候,并不是所有变量都是需要序列化的。这时候,可以在该变量前加上[NonSerialized]属性。比如线程ID,这类变量是后来生成的。所以,我们可以写如下代码声明,不需要将这个属性记录。

[Serializable]
public class Player
...{
public string Name;
public uint Level;
public uint Hp;
public uint HpMax;
public uint Mp;
public uint MpMax;
public uint Exp;
public uint ExpMax;
[NonSerialized]
public string ThreadId;
}

下一次再探讨网络通讯中的序列化。

反序列化作用

  • 2013年07月04日 07:12
  • 104KB
  • 下载

Java又一个反序列化漏洞——XStream漏洞

XStream是一个著名的反序列化的库,用途广泛,原文中作者以Jenkins为例。实际上XStream可以用在JIRA, Confluence, Bamboo,甚至是Spring和Struts中。 ...

Xml反序列化

  • 2013年09月15日 12:02
  • 25KB
  • 下载

Web前台传对象字符串到后台并让后台反序列化对象字符串的方法(ASP.NET) json对象和字符串的转换

从零开始做了两个月多一点的.NET开发,期间经常遇到需要从Web前台传数据给后台处理的情况。比如下面(用了jQuery的Ajax Post),这里为了演示方便没有对参数进行encodeURICompo...

JBOSS反序列化漏洞工具

  • 2016年03月28日 17:41
  • 5.31MB
  • 下载

java反序列化利用

  • 2017年08月31日 23:54
  • 33.79MB
  • 下载

Jackson反序列化的实现方法

jackson反序列化主要有两种情况,一种是单对象反序列化,另一种是多对象、复杂对象(集合等)反序列化,具体如下: 一、单对象序列化 LatConfig latConfigObject = Jacks...

weblogic反序列化漏洞测试jar包

  • 2016年02月17日 16:49
  • 761KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[笔记]序列化与反序列化的讨论(一)
举报原因:
原因补充:

(最多只允许输入30个字)