(  (From Msdn) 自定义序列化是控制类型的序列化和反序列化的过程,通过控制序列化,可以确保序列化兼容性。换而言之,在不中断类型核心功能的情况下,可在类型的不同版本之间序列化和反序列化。

重要提示:在早于 .NET Framework 4 的版本中,部分受信任的程序集中自定义用户数据的序列化是使用 GetObjectDatamethod() 完成的。 从版本 4.0 开始,该方法将标记有 SecurityCriticalAttribute 特性,该特性阻止在部分受信任的程序集中执行。 若要解决此情况,请实现 ISafeSerializationData 接口)

实现方法:

通过自定义类实现接口ISerializable来实现,需要实现接口的GetObjectData方法,添加一个特殊的构造函数,这个构造函数的参数必须与GetObjectData方法的参数相同(在反序列化时调用),如果缺少GetObjectData,编译器会发出警告,但是,鉴于无法强制现实构造函数,如果不存在构造函数,则不会发出任何警告,但此时如果尝试对某个对象进行反序列化,将会发生异常。

ISerializable接口代码:

  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Security;
  4.  
  5. namespace System.Runtime.Serialization
  6. {
  7. // 摘要:
  8. // 允许对象控制其自己的序列化和反序列化过程。
  9. [ComVisible(true)]
  10. public interface ISerializable
  11. {
  12. // 摘要:
  13. // 使用将目标对象序列化所需的数据填充 System.Runtime.Serialization.SerializationInfo。
  14. //
  15. // 参数:
  16. // info:
  17. // 要填充数据的 System.Runtime.Serialization.SerializationInfo。
  18. //
  19. // context:
  20. // 此序列化的目标(请参见 System.Runtime.Serialization.StreamingContext)。
  21. //
  22. // 异常:
  23. // System.Security.SecurityException:
  24. // 调用方没有所要求的权限。
  25. [SecurityCritical]
  26. void GetObjectData(SerializationInfo info, StreamingContext context);
  27. }
  28. }

其中参数 info 用来存放将要序列化或反序列化的对象的数据

context 描述给定的序列化流的源和目标,并提供一个由调用方定义的附加上下文

自定义Goods类实现ISerializable接口

  1. [Serializable]
  2. public class Goods:ISerializable
  3. {
  4. /// <summary>
  5. /// 名称
  6. /// </summary>
  7. public string name { get; set; }
  8.  
  9. /// <summary>
  10. /// 价格
  11. /// </summary>
  12. public double price { get; set; }
  13.  
  14. /// <summary>
  15. /// 分类
  16. /// </summary>
  17. public string type { get; set; }
  18.  
  19. public void GetObjectData(SerializationInfo info, StreamingContext context)
  20. {
  21. info.AddValue("name", name);
  22. info.AddValue("price", price);
  23. //info.AddValue("type", type); //此属性不序列化
  24. }
  25. public Goods() { }
  26.  
  27. //声明为私有的或受保护的,防止直接使用它
  28. protected Goods(SerializationInfo info, StreamingContext context)
  29. {
  30. name = info.GetString("name");
  31. price = info.GetDouble("price");
  32. //type = info.GetString("type"); //此属性无法反序列化
  33.  
  34. } }

分析:在实现 GetObjectData 方法时,最常调用的SerializationInfo的方法是AddValue,这个方法具有针对所有标准类型(int、char等等)的重载版本,将待序列化变量以名称和值对的形式添加;(而 StreamingContext 参数描述给定的序列化流的源和目标,这样就可以知道是将对象序列化到持久性存储还是在将他们跨进程或机器序列化)。而在反序列化时,我们调用SerializationInfo提供的一组GetValue方法,他们针对所有标准类型数据执行各种AddValue重载版本的逆操作。

在要序列化的时候我们通过AddValue()方法往info中填充数据,序列化程序将保存在info中的数据进行序列化。

而当要反序列化的时候,我们从info中用GetValue()将数据取出,赋值给对应的属性

测试代码:

  1. Goods good = new Goods();
  2. good.name = "苹果";
  3. good.price = ;
  4. good.type = "水果";
  5.  
  6. string dir = System.AppDomain.CurrentDomain.BaseDirectory;
  7.  
  8. //序列化
  9. IFormatter formatter = new BinaryFormatter();
  10. Stream stream = new FileStream(dir + "test.bin", FileMode.Create, FileAccess.Write);
  11. formatter.Serialize(stream, good);
  12. stream.Close();//必须关闭
  13.  
  14. //反序列化
  15. IFormatter reformatter = new BinaryFormatter();
  16. Stream filestream = new FileStream(dir + "test.bin", FileMode.Open, FileAccess.Read);
  17.  
  18. //返回Object类型,必须强制转换
  19. Goods newgood = (Goods)reformatter.Deserialize(filestream);
  20. filestream.Close();
  21.  
  22. Console.WriteLine("名称:"+newgood.name);
  23. Console.WriteLine("价格:"+newgood.price);
  24. Console.WriteLine("类型:"+newgood.type);
  25. Console.ReadLine();

运行结果:type属性没有序列化

参考 http://msdn.microsoft.com/zh-cn/library/ty01x675.aspx

基础命名空间:序列化_自定义序列化 System.Runtime.Serialization的更多相关文章

  1. 基础命名空间:序列化 System.Runtime.Serialization

    对象通常都有状态(state),从一个对象中抽取这种状态,不论是将它存储于某地,还是通过网络传送,这种抽取动作称为“将一个对象序列化”,而反向处理过程,从一个被序列化的状态重建一个对象即为反序列化. ...

  2. System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization.dll 中发生

    异常信息: “System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization. ...

  3. System.Runtime.Serialization.cs

    ylbtech-System.Runtime.Serialization.cs 允许对象控制其自己的序列化和反序列化过程. 1.返回顶部 1. #region 程序集 mscorlib, Versio ...

  4. 找不到方法:“Boolean System.Runtime.Serialization.DataContractAttribute.get_IsReference()”的解决办法

    找不到方法:“Boolean System.Runtime.Serialization.DataContractAttribute.get_IsReference()”.的解决办法站点发布后部署到了两 ...

  5. 重写成员“log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)”时违反了继承安全性规则

    在.NET 4.0下使用最新版本的log4Net 1.2.10,会遇到下面这样的错误: 重写成员“log4net.Util.ReadOnlyPropertiesDictionary.GetObject ...

  6. 找不到System.Runtime.Serialization.Json的解决方案

    System.ServiceModel System.ServiceModel.Web System.Runtime.Serialization 三者均要添加引用

  7. 引用System.Runtime.Serialization.Json

    vs2012下,重新添加一次System.Runtime.Serialization的引用

  8. csharp:.net 3.5 using System.Runtime.Serialization.Json read json

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. C# Serialization performance in System.Runtime.Serialization.Formatters.Binary.BinaryFormatter,Newtonsoft.Json.JsonConvert and System.Text.Json.JsonSerializer.Serialize

    In .net core 3.0 using System;using System.Collections.Generic;using System.Collections;using System ...

随机推荐

  1. android default_workspace.xml

    //default_workspace.xml中,支持的标签有: favorite:应用程序快捷方式. shortcut:链接,如网址,本地磁盘路径等. search:搜索框. clock:桌面上的钟 ...

  2. ORACLE控制文件一致性【weber出品】

    一.首先控制文件有什么作用呢? 控制文件记录了如下信息:1.数据库的创建时间2.数据文件的位置3.日志文件的位置等作用是指导数据库 找到数据文件,日志文件并将数据库启动到 open 状态. 与其用文字 ...

  3. Hadoop文件的基本操作

    Hadoop提供了大量的API对文件系统中的文件进行操作,主要包括: (1)读取文件 (2)写文件 (3)读取文件属性 (4)列出文件 (5)删除文件 1、读取文件 以下示例中,将hdfs中的一个文件 ...

  4. python 画正弦曲线

    要画正弦曲线先设定一下x的取值范围,从0到2π.要用到numpy模块. numpy.pi 表示π numpy.arange( 0 , 2π ,0.01)  从0到2π,以0.01步进. 令 x=num ...

  5. Linux下使用VirtualBox安装Windows系统

    (文档比较长,只是写的详细,实际操作起来相对简单.) 由于一些特殊原因,我们并不能完全抛下Windows而使用Linux.VirtualBox 是一款虚拟机软件,支持多系统.在Linux下安装 Vir ...

  6. Win8 X64下JDK版本切换问题

    1:现在笔记本上安装的是,执行java -version: 2:现在又安装了,想通过修改环境变量,使JDK切换到1.6版本上 JDK的安装目录:D:\Java\ 修改环境变量: (1)JAVA_HOM ...

  7. C51工具是怎么进行覆盖分析的

    C51工具针对8051微控制器的有限存储器资源进行了优化设计. 为了最有效地利用存储器,根据一个很容易解释的方法,自动变量和函数参数在存储器中均进行覆盖处理. 首先,连接器根据源程序生成调用树.例如: ...

  8. Seafile的手册

    http://manual.seafile.com/http://manual-cn.seafile.com/deploy/using_mysql.html 中文版http://manual-cn.s ...

  9. linux环境c++开发:ubuntu12.04使用llvm3.4.2

    什么是 clang/llvm/libc++[1] clang 是最近几年(在大财主苹果的支持下)发展得非常好的 C 家族语言 (包括C/C++/Obj-C/Obj-C++) 编译器前端,所谓前端,就是 ...

  10. 关于Microsoft app下同义词的整理

    Windows os 以下词表达的是同一个概念 windows store app windows metro app windows modern app windows runtime app w ...