序列化、反序列化的版本控制以及序列化、反序列化集合对象

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

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

        }

时间: 2025-01-02 17:13:30

序列化、反序列化的版本控制以及序列化、反序列化集合对象的相关文章

DRF框架(三)——media资源路径设置、多表序列化(ModelSerializer)、多表反序列化、多表序列化与反序列化整合(重点)

media资源路径设置  (设置好后把图片放在这个文件夹中,通过链接能访问到图片) 1.先在根目录设置一个media文件夹 2.配置settings.py,加上下面的 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 3.在urls.py路由设置 from django.views.static import serve from django.conf import settings urlpatterns =

C# 序列化(二)二进制序列化的案例

这篇是针对上一篇讲序列化的文章的一个实际案例,WinForm程序的主界面如下: 思路:在点击保存按钮时,将标题和内容保存到集合中,自然想到应该是Dictionary<K,V>,而且用这个集合可以避免产生2个相同标题的日记.对添加到集合中的数据,采用二进制序列化到文件中,在程序执行目录中专门建一个“Notes”的文件夹存放日记文件,日记文件的文件名以标题命名.程序加载的时候,如果“Notes”文件夹下有文件,就在右侧列表中加载文件,点击时反序列化后显示在左侧.下面是具体代码: 在Form1类下定

java中的对象为什么需要序列化,什么时候要序列化

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题.序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用Ob

[.net&#160;面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化

[.net 面向对象程序设计进阶]  (9)  序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对象转向其他数据格式的过程,即序列化(Serialization). 与之相反的过程就是反序列化(Deserialization).掌握和利用好序列化和反序列化的方法,对提高面向编程技术很有益处. 读前必备: A.类和类的实例  [.net 面向对象编程基础]  (9) 类和类的实例  B.类的成员

什么事Java序列化,如何实现Java序列化

Java 串行化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象.这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库.文件等系统里.Java的串行化机制是RMI.EJB等技术的技术基础.用途:利用对象的串行化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态. 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后

什么是java 序列化,如何实现java 序列化?

我们有时候将一个 java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个java 对象,例如,要将java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了这种支持,我们可以调用OutputStream 的writeObject 方法来做,如果要让java帮我们做,要被传输的对象必须实现serializable 接口,这样,javac 编译时就会进行特殊处理,编译的类才可以被writeOb

转载---Java集合对象的深度复制与普通复制

原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复制的区别. 1.首先是对Java集合对象得浅复制与深度复制的理解 普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域.所以当拷贝的集合修改了集合对象内的数据,那么源集合对象也就随之改变了,这样的效果我们称之为Java集合对象

java集合对象区别二

集合包是Java中最常用的包,它最常用的有Collection和Map两个接口的实现类,Collection用于存放多个单对象,Map用于存放Key-Value形式的键值对. Collection中常用的又分为两种类型的接口:List和Set,两者最明显的差别为List支持放入重复的对象,而Set不支持.List接口常用的实现类有:ArrayList,LinkedList,Vector和Stack:Set接口常用的实现有HashSet,TreeSet.而Map的常用实现有TreeMap和Hash

.net集合对象解惑篇

.Net中大量的集合对象是否曾让你头痛,那么现在就让我作为你的"导游"带着你走出来.帮助你在System.Collections名域中找到自己的方向. 集合提供了一种将任意对象格式化存储的方法,我们都知道在日常的程序设计中,它们是多么有帮助.接下来就随我找到它并认识它. 一.定义    从.NET的角度来看,一个集合可以被定义为一个实现了一个或多个System.Collections.ICollection.System.Collections.IDictionary和System.C