良许Linux教程网 干货合集 C#序列化与反序列化集合对象并进行版本控制详解

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

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

image-20221111203747321

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

首先可以使用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;
}

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

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部