網站首頁 編程語言 正文
當涉及到跨進程甚至是跨域傳輸數據的時候,我們需要把對象序列化和反序列化。
首先可以使用Serializable特性。
[Serializable]
public class Person
{
public string _firstName;
public string _secondName;
//序列化
[OnSerializing]
internal void OnSerializing(StreamingContext context)
{
_firstName = _firstName.ToUpper();
_secondName = _secondName.ToUpper();
}
//反序列化
[OnDeserialized]
internal void OnDeserialized(StreamingContext context)
{
_firstName = _firstName.ToLower();
_secondName = _secondName.ToLower();
}
}
當然,也可以實現ISerializable接口。在接口方法GetObjectData完成序列化,把信息保存到SerializationInfo中,在構造函數中反序列化,把信息從SerializationInfo中讀取出來。
[Serializable]
public class Person : ISerializable
{
public string _firstName;
public string _secondName;
public Person()
{
}
//反序列化
public Person(SerializationInfo si, StreamingContext context)
{
_firstName = si.GetString("first").ToLower();
_secondName = si.GetString("second").ToLower();
}
//序列化
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("first", _firstName.ToUpper());
info.AddValue("second",_secondName.ToUpper());
}
}
對序列化和反序列化對象進行版本控制
下面的類,描述了對象的第一個版本。
[Serializable]
public class SomeClass : ISerializable
{
private int a;
public SomeClass(){}
public SomeClass(SerializationInfo info, StreamingContext context)
{
a = info.GetInt32("myval");
}
public void GetObjectData(SerializationInfo, StreamingContext context)
{
info.AddValue("VERSION",1);
info.AddValue("myval", a);
}
}
現在SomeClass要增加一個私有字段,成為版本二。
[Serializable]
public class SomeClass : ISerializable
{
private int a;
private string b;
public SomeClass(){}
public SomeClass(SerializationInfo info, StreamingContext context)
{
int VERSION = info.GetInt32("VERSION");
a = info.GetInt32("a");
if(VERSION > 1)
{
b = info.GetString("another");
}
else
{
b = "默認值";
}
}
public void GetObjectData(SerializationInfo, StreamingContext context)
{
info.AddValue("VERSION",2);
info.AddValue("myval", a);
info.AddValue("another", b);
}
}
把集合對象序列化到文件并反序列化讀出
如果一個集合對象需要實現序列化和反序列化,那么集合元素對象必須可以被序列化和反序列化,并且集合元素對象中的對象屬性也必須可以被序列化和反序列化,依此類推。
[Serializable]
public class Car : ISerializable
{
private string _model;
private int _year;
private Owner _owner;
public Car()
{
}
public Car(SerializationInfo info, StreamingContext context)
{
this._model = (string) info.GetValue("Model", typeof (string));
this._year = (int) info.GetValue("Year", typeof (int));
this._owner = (Owner) info.GetValue("Owner", typeof (Owner));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Model",this._model);
info.AddValue("Year", this._year);
info.AddValue("Owner", this._owner);
}
}
[Serializable]
public class Owner : ISerializable
{
private string _name;
public Owner()
{
}
public Owner(SerializationInfo info, StreamingContext context)
{
this._name = (string) info.GetValue("Name", typeof (string));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", this._name);
}
}
以上,我們想序列化Car的集合到文件中,再反序列化Cars的集合讀取出來。那么,我們必須讓Car可以被序列化和反序列化,Car的屬性對象Owner也必須可以被序列化和反序列化。
接著,用來封裝Car集合的一個類。
[Serializable]
public class CarsList : ISerializable
{
private List<Car> _cars;
public List<Car> Cars
{
get { return this._cars; }
set { this._cars = value; }
}
public CarsList()
{
}
public CarsList(SerializationInfo info, StreamingContext context)
{
this._cars = (List<Car>) info.GetValue("Cars", typeof (List<Car>));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Cars", this._cars);
}
}
針對CarsList寫一個序列化和反序列化的幫助類。
public class SerializerHelper
{
public SerializerHelper()
{
}
//序列化
public void SerializeObject(string fileName, CarsList carsList)
{
//根據文件名打開流
Stream stream = File.Open(fileName, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
//把對象序列化到流中
bFormatter.Serialize(stream,carsList);
stream.Close();
}
//反序列化
public CarsList DeserializeObject(string fileName)
{
CarsList carsList;
//根據文件名打開流
Stream stream = File.Open(fileName, FileMode.Open);
BinaryFormatter bfFormatter = new BinaryFormatter();
carsList = (CarsList)bfFormatter.Deserialize(stream);
stream.Close();
return carsList;
}
}
在客戶端按如下調用:
static void Main(string[] args)
{
List<Car> cars = new List<Car>();
CarsList carsList = new CarsList();
carsList.Cars = cars;
SerializerHelper serializerHelper = new SerializerHelper();
serializerHelper.SerializeObject(@"temp.txt", carsList);
carsList = serializerHelper.DeserializeObject(@"temp.txt");
cars = carsList.Cars;
}
原文鏈接:https://www.cnblogs.com/darrenji/p/4322567.html
相關推薦
- 2022-07-11 PostgreSQL連接到數據庫增刪改查
- 2023-01-21 C++實現逆波蘭表達式的例題詳解_C 語言
- 2022-06-04 Kubernetes中Deployment的升級與回滾_云和虛擬化
- 2022-06-17 GO語言協程互斥鎖Mutex和讀寫鎖RWMutex用法實例詳解_Golang
- 2021-12-09 android藍牙簡單開發示例教程_Android
- 2024-03-03 layui彈窗編輯表單清空
- 2022-08-30 Spark中緩存和檢查點的區別
- 2023-07-08 vs編譯運行報錯:未聲明的標識符
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支