广告位联系
返回顶部
分享到

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

C#教程 来源:互联网 作者:佚名 发布时间:2022-09-14 08:36:40 人浏览
摘要

当涉及到跨进程甚至是跨域传输数据的时候,我们需要把对象序列化和反序列化。 首先可以使用Serializable特性。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [Serializable] public class Person { pub

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

首先可以使用Serializable特性。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

[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中读取出来。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

[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());

     }

 }

对序列化和反序列化对象进行版本控制

下面的类,描述了对象的第一个版本。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

[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要增加一个私有字段,成为版本二。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

[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);

    }

}

把集合对象序列化到文件并反序列化读出

如果一个集合对象需要实现序列化和反序列化,那么集合元素对象必须可以被序列化和反序列化,并且集合元素对象中的对象属性也必须可以被序列化和反序列化,依此类推。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

[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集合的一个类。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

[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写一个序列化和反序列化的帮助类。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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;

    }

}

在客户端按如下调用:

1

2

3

4

5

6

7

8

9

10

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;

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://www.cnblogs.com/darrenji/p/4322567.html
相关文章
  • WPF实现窗体亚克力效果的代码

    WPF实现窗体亚克力效果的代码
    WPF 窗体设置亚克力效果 框架使用大于等于.NET40。 Visual Studio 2022。 项目使用MIT开源许可协议。 WindowAcrylicBlur设置亚克力颜色。 Opacity设置透
  • C#非托管泄漏中HEAP_ENTRY的Size对不上解析

    C#非托管泄漏中HEAP_ENTRY的Size对不上解析
    一:背景 1. 讲故事 前段时间有位朋友在分析他的非托管泄漏时,发现NT堆的_HEAP_ENTRY的 Size 和!heap命令中的 Size 对不上,来咨询是怎么回事?
  • C#中ArrayList 类的使用介绍
    一:ArrayList 类简单说明 动态数组ArrayList类在System.Collecions的命名空间下,所以使用时要加入System.Collecions命名空间,而且ArrayList提供添加,
  • C#使用BinaryFormatter类、ISerializable接口、XmlSeriali

    C#使用BinaryFormatter类、ISerializable接口、XmlSeriali
    序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程。对象一旦被序列化,就可以把对象状态保存到硬盘的某个位
  • C#序列化与反序列化集合对象并进行版本控制
    当涉及到跨进程甚至是跨域传输数据的时候,我们需要把对象序列化和反序列化。 首先可以使用Serializable特性。 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  • C#事件中关于sender的用法解读

    C#事件中关于sender的用法解读
    C#事件sender的小用法 开WPF新坑了,看了WPF的炫酷界面,再看看winForm实在是有些惨不忍睹(逃)。后面会开始写一些短的学习笔记。 一、什么
  • 在C#程序中注入恶意DLL的方法

    在C#程序中注入恶意DLL的方法
    一、背景 前段时间在训练营上课的时候就有朋友提到一个问题,为什么 Windbg 附加到 C# 程序后,程序就处于中断状态了?它到底是如何实现
  • 基于C#实现一个简单的FTP操作工具
    实现功能 实现使用FTP上传、下载、重命名、刷新、删除功能 开发环境 开发工具: Visual Studio 2013 .NET Framework版本:4.5 实现代码 1 2 3 4 5 6 7
  • C#仿QQ实现简单的截图功能

    C#仿QQ实现简单的截图功能
    接上一篇写的截取电脑屏幕,我们在原来的基础上加一个选择区域的功能,实现自定义选择截图。 个人比较懒,上一篇的代码就不重新设计
  • C#实现线性查找算法的介绍
    线性查找,肯定是以线性的方式,在集合或数组中查找某个元素。 通过代码来理解线性查找 什么叫线性?还是在代码中体会吧。 首先需要一
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计