关闭

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

432人阅读 评论(0) 收藏 举报

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

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

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

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

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

[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;
}

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

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10139次
    • 积分:168
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    文章分类
    文章存档