網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
當(dāng)涉及到跨進(jìn)程甚至是跨域傳輸數(shù)據(jù)的時(shí)候,我們需要把對(duì)象序列化和反序列化。
首先可以使用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();
}
}
當(dāng)然,也可以實(shí)現(xiàn)ISerializable接口。在接口方法GetObjectData完成序列化,把信息保存到SerializationInfo中,在構(gòu)造函數(shù)中反序列化,把信息從SerializationInfo中讀取出來(lái)。
[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());
}
}
對(duì)序列化和反序列化對(duì)象進(jìn)行版本控制
下面的類(lèi),描述了對(duì)象的第一個(gè)版本。
[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);
}
}
現(xiàn)在SomeClass要增加一個(gè)私有字段,成為版本二。
[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 = "默認(rèn)值";
}
}
public void GetObjectData(SerializationInfo, StreamingContext context)
{
info.AddValue("VERSION",2);
info.AddValue("myval", a);
info.AddValue("another", b);
}
}
把集合對(duì)象序列化到文件并反序列化讀出
如果一個(gè)集合對(duì)象需要實(shí)現(xiàn)序列化和反序列化,那么集合元素對(duì)象必須可以被序列化和反序列化,并且集合元素對(duì)象中的對(duì)象屬性也必須可以被序列化和反序列化,依此類(lèi)推。
[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的集合讀取出來(lái)。那么,我們必須讓Car可以被序列化和反序列化,Car的屬性對(duì)象Owner也必須可以被序列化和反序列化。
接著,用來(lái)封裝Car集合的一個(gè)類(lèi)。
[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);
}
}
針對(duì)CarsList寫(xiě)一個(gè)序列化和反序列化的幫助類(lèi)。
public class SerializerHelper
{
public SerializerHelper()
{
}
//序列化
public void SerializeObject(string fileName, CarsList carsList)
{
//根據(jù)文件名打開(kāi)流
Stream stream = File.Open(fileName, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
//把對(duì)象序列化到流中
bFormatter.Serialize(stream,carsList);
stream.Close();
}
//反序列化
public CarsList DeserializeObject(string fileName)
{
CarsList carsList;
//根據(jù)文件名打開(kāi)流
Stream stream = File.Open(fileName, FileMode.Open);
BinaryFormatter bfFormatter = new BinaryFormatter();
carsList = (CarsList)bfFormatter.Deserialize(stream);
stream.Close();
return carsList;
}
}
在客戶端按如下調(diào)用:
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
相關(guān)推薦
- 2022-10-12 排查服務(wù)器異常流量教程詳解_nginx
- 2022-08-20 python數(shù)字圖像處理之對(duì)比度與亮度調(diào)整示例_python
- 2022-04-18 詳解OpenGL?Shader抗鋸齒的實(shí)現(xiàn)_Android
- 2022-10-03 Python實(shí)現(xiàn)數(shù)據(jù)清洗的示例詳解_python
- 2022-02-28 純 CSS實(shí)現(xiàn)根據(jù)元素已知的寬度設(shè)置高度以及注意事項(xiàng)
- 2022-12-14 Oracle?REGEXP_LIKE模糊查詢用法例子_oracle
- 2022-05-11 【GitUtils】獲取gitee倉(cāng)庫(kù)具體路徑下的內(nèi)容
- 2022-04-25 ASP.NET?Core?MVC中Tag?Helpers用法介紹_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支