我们可以实现ISerializable接口来自定义串行化行为。这个接口只有一个方法GetObjectData。这个方法用于将对类对象进行序列化所需的数据填进SerializationInfo对象。你使用的格式化器(比如BinaryFormatter)将构造SerializationInfo对象,然后在序列化时调用GetObjectData。因此,你需要实现GetObjectData,让它添加你从类中选择的值,并且映射到你选择的字符串名。注意,如果类的父类也实现ISerializable,那么应该调用GetObjectData的父类实现。
给出例子:

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class Insect : ISerializable
{
    private string name;
    private int id;
    public Insect(string name, int id)
    {
        this.name = name;
        this.id = id;
    }
    public override string ToString()
    {
        return String.Format("{0}:{1}", name, id);
    }
    public Insect(){}
    
    public virtual void GetObjectData(SerializationInfo s, StreamingContext c)
    {
        s.AddValue("CommonName", name);
        s.AddValue("ID#", id);
    }
    private Insect(SerializationInfo s, StreamingContext c)
    {
        name = s.GetString("CommonName");
        id = s.GetInt32("ID#");
    }
}

class ImpISerialApp
{
    static void Main(string[] args)
    {
        Insect i = new Insect("Meadow Brown", 12);
        Stream s = File.Create("Insect.bin");
        BinaryFormatter b = new BinaryFormatter();
        b.Serialize(s, i);
        s.Seek(0, SeekOrigin.Begin);
        Insect j = (Insect)b.Deserialize(s);
        s.Close();
        Console.WriteLine(j);
    }
}

Insect.bin包含以下信息:
DISerializable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null Insect
CommonName ID# Meadow Brown

转载于:https://www.cnblogs.com/wdxinren/archive/2004/10/23/55826.html

序列化 - 实现ISerializable相关推荐

  1. Serializable java序列化

    Bean Serializable Interface 的接口让BEAN可以串行化,将其变成一个可保存为以后使用的二进制流.当一个BEAN被系列化到磁盘上或者其他任何地方,其状态被保存起来,其中的属性 ...

  2. C#序列化与反序列化方式简单总结

    序列化和反序列化 相关类: System.SerializableAttribute特性(或称为属性), System.Runtime.Serialization.ISerializable(自定义序 ...

  3. .net byte转java byte_CVE20200688的武器化与.net反序列化漏洞那些事

    0x00 前言CVE-2020-0688是Exchange一个由于默认加密密钥造成的反序列化漏洞,该漏洞存在于Exchange Control Panel(ecp)中,不涉及Exchange的工作逻辑 ...

  4. C#自定义序列化反序列化与 ISerializable 接口

    ISerializable 接口 MSDN注解:允许对象控制其自己的序列化和反序列化过程. ISerializable 接口的定义: public interface ISerializable {v ...

  5. ISerializable接口-控制序列化与反序列化(回答C#不需要实现此接口也可以序列化,那么实现该接口的意义是什么?)

    https://www.cnblogs.com/fanfan-90/p/12038928.html (回答C#不需要实现此接口也可以序列化,那么实现该接口的意义是什么?) ISerializable接 ...

  6. C# 的三种序列化方法

    序列化是将一个对象转换成字节流以达到将其长期保存在内存.数据库或文件中的处理过程.它的主要目的是保存对象的状态以便以后需要的时候使用.与其相反的过程叫做反序列化. 序列化一个对象 为了序列化一个对象, ...

  7. DataRow的序列化问题

      来源:CSDN  作者:kroll 在.net里,DataRow类型的对象是不支持序列化的,那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢?呵呵,幸好Datatable是支 ...

  8. 菜菜从零学习WCF十(序列化)

    前言 本次课程的主要内容包括以下四格部分:DataContractSerializer.序列化.反序列化.XmlSerializer 第一部分--DataContractSerializer Wind ...

  9. 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)

    序列化概述: 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象 ...

最新文章

  1. 如何在Visual Studio中“添加现有项”整个目录结构?
  2. .html(),.text()和.val()的差异总结
  3. GDB调试及其调试脚本的使用
  4. 原理图生成pdf 汉字不显示_EPLAN官方视频系列之二丨原理图设计智能功能(1)...
  5. info - 阅读 info 文档
  6. java根据数据库自动生成代码
  7. 通过Rman catalog 创建及管理Oracle数据库备份
  8. StringUtil工具类之去除所有的空白字符
  9. Devops知识技能树(译)
  10. hao123劫持浏览器主页
  11. 除了性以外,有没有快速、高效的释放压力、清空大脑的方式?
  12. 【数智化人物展】网智天元莫倩:“感、联、知、控”,四步方可打造企业数智化转型升级路径...
  13. VS调用大恒相机sdk实时显示图像并进行图像处理+OPENCV
  14. 自己撸一个Wordcount
  15. c语言 乘法运算符,C 乘法运算符
  16. 烤仔观察 | 从蓝海到红海,科技巨头们和他们元宇宙世界
  17. Java线程池几个参数的理解
  18. 国内十大活跃报表 BI 产品深度点评
  19. 百度关键词排名查询源码_百度推广优化技巧,百度搜索关键词排名优化
  20. 神经元的结构图手绘,神经元图片手绘图

热门文章

  1. eclipse git提交代码_来看看大厂的Git提交规范,千万别乱提交代码哦...
  2. linux shell 等待输入_linux运维——基础篇
  3. python函数的传递方式有哪些_Python全栈工程师(函数的传参)
  4. 频率响应函数与数字滤波实验_WKD3419振动测试与控制教学实验系统
  5. android 多手指触摸屏,AIR Android:关于多点触摸
  6. 学什么就业前景好的专业_新能源汽车专业学什么?其就业前景如何?
  7. 知乎大神深入解析:单片机晶振脚原理是什么?
  8. 不懂电容原理?那是你没看到这些动图
  9. 来了,单片机最强科普总结!
  10. 「第三篇」全国电子设计竞赛,这些你必须知道的比赛细节,文末附上近十年电赛题目下载...