阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

C#序列化与反序列化集合对象并进行版本控制详解

266次阅读
没有评论

共计 4155 个字符,预计需要花费 11 分钟才能阅读完成。

导读 这篇文章介绍了 C# 序列化与反序列化集合对象并实现版本控制的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

当涉及到跨进程甚至是跨域传输数据的时候,我们需要把对象序列化和反序列化。

首先可以使用 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 _cars;
    public List Cars
    {get { return this._cars;}
        set {this._cars = value;}
    }
    public CarsList()
    { }
    public CarsList(SerializationInfo info, StreamingContext context)
    {this._cars = (List) info.GetValue("Cars", typeof (List));
    }
    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 cars = new List();
    CarsList carsList = new CarsList();
    carsList.Cars = cars;
    SerializerHelper serializerHelper = new SerializerHelper();
    serializerHelper.SerializeObject(@"temp.txt", carsList);
    carsList = serializerHelper.DeserializeObject(@"temp.txt");
    cars = carsList.Cars;
}

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计4155字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7799628
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛 NAS 玩转 Frpc 并且配置,随时随地直连你的私有云 大家好,我是星哥,最近在玩飞牛 NAS。 在数...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...