1.软文推荐

2.软文推荐

3.软文推荐

这篇文章介绍了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;
}

本文来源:www.lxlinux.net/12233.html,若引用不当,请联系修改。

相关文章 8

1

MySQL通过UDF调用shell脚本 2分钟前

前言 在最近的项目中,由于需要使用MySQL的UDF(user defined function),这个特性从未使用过,而且个人觉得这个特性以后应该会经常使用,所...

2

云服务器租用该如何选择配置,一般价格是多少?(云计算服务器租用) 3分钟前

云服务器租用该如何选择配置,一般价格是多少? 打算租用一台服务器用来放公司的网站,请问该租用什么配置的云服务器,价格是多少?...

3

Ubuntu中安装多个终端以及更换默认终端 6分钟前

终端其实就是为主机提供了人机接口,每个人都通过终端使用主机的资源。终端有字符终端和图形终端两种模式。在图形环境下,通过鼠标...

4

英特尔Meteor Lake ISH获得Linux 6.1驱动支持 7分钟前

在 Linux 6.1 合并窗口打开之前,人机接口设备 (HID) 子系统已经有大量更新补丁在排队了。 截止目前,HID 子系统的 for-next 分支中的一些 HID...

5

服务器放几个网站才算正常?(局域网能有几个服务器) 9分钟前

服务器放几个网站才算正常?常常会出现一些有服务器要求的顾客会问那样一个难题:一个服务器放几个网站?在具体中,这个问题非常的...

6

Linux系统修改docker镜像源 11分钟前

因为Docker镜像源是国外的所以在国内访问会非常缓慢,下面良许教程网为大家分享一下几个国内中非常不错的镜像源。 国内亲测可用的几个...

7

美国高防服务器怎么样?美国高防云服务器哪家好?(美国高防服务器秒解) 13分钟前

美国高防服务器怎么样? 如今站长建设网站,不但要求优化工作要做好,更重要的是还要做好网站的安全防御措施,因而美国高防服务器越...

8

编写高效的 Shell 脚本具体方法 16分钟前

如果你希望自动执行常规任务并使你的生活更轻松,那么使用 Shell 脚本是一个很好的选择。本文将向你介绍一些基本概念,这些概念将帮助...