C# Serialization(序列化)

C# Serialization(序列化)

什么是Serialization?

将Object存储为数据(类似于游戏存档)

逆过程即 De-serialization,将数据转化为 Object (类似于游戏读档)

为什么要序列化?

把之前杂乱的数据排列,成为一个有序的数据,方便保存

C# Serialization 运用

假设我们有一个Class叫做Game Data,记录了一些游戏数据

public clas GameData 
{
	public int health { get; set;} = 100; 
	public int attack { get; set;} = 5; 
	public int defense { get; set;] = 4;
}

之后我们创建了一个instance:

GameData data = new GameData(); 

C#提供了很多的序列化方法,这里以XML为例。

然后我们需要保存这个instance - Serialization:

XmlSerializer xmlserializer = new XmlSerializer(typeof(GameData); 
StreamWriter sw = new StreamWriter("C:\GameData"); xmlserializer.Serialize(sw, data); 
sw.Close(); 

保存之后的文件

<?xml version="1.0"encoding="utf-8”?>
<GameData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns.xsd="http:/www.w3.org/2001/XMLSchema"
	<health>100</health> 
	<attack>5</attack>
	<defense>4</defense> 
</Game Data> 
  • 与 binary format不同, XML 不指明data type(数据类型)

如果我们想要读取保存的文件→ De-Serialization:

XmlSerializer xmlserializer = new XmlSerializer(typeof(GameData); 
StreamReader sr = new StreamReader("C:\Game Data"); 
GameData data = (GameData) xmlserializer.Deserialize(sr); 
sr.Close();

[NonSerialized] / [Xmllgnore]

serializing 时,使我们的某个项目不被serialized

public class GameData 
{
	[Xmllgynore] public int health { get; set;} = 100;
	public int attackI get; set; = 5; 
	public int defense { get; set;} = 4; 
}

于是我们经过 serialization 后的文件变成了:

<?xml version="1.0" encoding="utf-8"?> 
<GameDat xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema">
    <attack>5</lattack>
    <defense>4</defense> 
</GameData>

[XmlElement]

public class GameData 
{
	[XmlElement(ElementName = "HP", Order = 3)] public int health { get; set;} = 100; 
	[XmlElement(ElementName = "ATK", Order = 2)] public int attack { get; set;} = 5; 
	[XmIElement(ElementName = "DEF", Order = 1)] public int defense { get; set;} = 4; 
}
	<?xml version="1.0" encoding="utf-8"?> <GameData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 				<DEF>4</DEF>
    <ATK>5</ATK>
    <HP>100</HP>
</GameData>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 C# 的 Hashtable 进行序列化,可以使用 .NET 中自带的 BinaryFormatter 类或者 Json.NET 库。 使用 BinaryFormatter 类进行序列化: ```csharp using System.IO; using System.Runtime.Serialization.Formatters.Binary; Hashtable hashtable = new Hashtable(); // 在 hashtable 中添加一些键值对 BinaryFormatter formatter = new BinaryFormatter(); using (Stream stream = new FileStream("hashtable.bin", FileMode.Create, FileAccess.Write, FileShare.None)) { formatter.Serialize(stream, hashtable); } ``` 使用 BinaryFormatter 类进行反序列化: ```csharp using System.IO; using System.Runtime.Serialization.Formatters.Binary; Hashtable hashtable = null; BinaryFormatter formatter = new BinaryFormatter(); using (Stream stream = new FileStream("hashtable.bin", FileMode.Open, FileAccess.Read, FileShare.Read)) { hashtable = (Hashtable)formatter.Deserialize(stream); } ``` 使用 Json.NET 库进行序列化: ```csharp using Newtonsoft.Json; Hashtable hashtable = new Hashtable(); // 在 hashtable 中添加一些键值对 string json = JsonConvert.SerializeObject(hashtable, Formatting.Indented); File.WriteAllText("hashtable.json", json); ``` 使用 Json.NET 库进行反序列化: ```csharp using Newtonsoft.Json; Hashtable hashtable = null; string json = File.ReadAllText("hashtable.json"); hashtable = JsonConvert.DeserializeObject<Hashtable>(json); ``` 需要注意的是,如果 Hashtable 中的值类型是自定义类型,那么在反序列化时需要确保该类型已经被加载。另外,因为 Hashtable 是不支持序列化的,所以在序列化时需要将其转换为支持序列化的类型,比如 Dictionary。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值