可序列化和自定义序列化

序列化技术的主要两个目的是:持久化存储、按值封送。

.NET Framework支持三种序列化器:Binary、XML、SOAP.他们各有优缺点,分别列如下

1. Binary序列化是完全保真的,因为除非特殊声明为NonSerialized,那么所有成员(包括私有的和公有的)都会被序列化。该序列化器的结果体积比较小,是二进制格式存储的。所以不便于平台复用。

2. XML序列化只序列化公有成员。它的结果是标准的XML文档,有利于跨平台。

3. SOAP序列化其实可以说是XML序列化的一种,但它的结果是特定的XML文档,遵从SOAP规范。XML Web Service技术默认会调用该序列化器在客户端与服务器之间传递请求和数据。

要让对象支持序列化,必须将其标记为可序列化(Serializable),基本上不需要其他的操作,序列化器就可以知道该如何做。但有一个问题需要注意,Serializable是不可继承的,也就是说即便父类是标记为可序列化的,那么子类也仍然需要标记为可序列化。

对于那些明确不想序列化的成员,可以通过标记为不可序列化(NonSerialized)来告诉序列化器。

如果想更加精确地控制序列化的过程,那么可以为类型实现ISerizlizable接口。该接口要求实现一个方法GetObjectData,其实很简单,依次把有关你想序列化的成员放进去即可(当然可以做一些特殊的处理,例如加密等),值得注意的是,除了实现该方法,还需要编写一个特殊的构造函数,该函数具有与GetObjectData方法一样的签名,在这个方法里面依次把成员取出来即可。(该方法里面当然可以做另外一些处理,例如解密等,它是在反序列化的时候自动被调用的)

public int Id { get; set; }
public string Description { get; set; }

public absCustomer() { }

public absCustomer(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
    Id = info.GetInt32("Id");
    Description = info.GetString("Description");
}

#region ISerializable 成员

public virtual void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
    info.AddValue("Id", Id);
    info.AddValue("Description", Description);

}

#endregion

序列化过程的步骤
在格式化程序上调用 Serialize 方法时,对象序列化按照以下规则进行:

    1. 检查格式化程序是否有代理选取器。如果有,检查代理选取器是否处理指定类型的对象。如果选取器处理此对象类型,将在代理选取器上调用 ISerializable.GetObjectData。
    2. 如果没有代理选取器或有却不处理此类型,将检查是否使用 Serializable 属性对对象进行标记。如果未标记,将会引发 SerializationException。
    3. 如果对象已被正确标记,将检查对象是否实现了 ISerializable。如果已实现,将在对象上调用 GetObjectData。
    4. 如果对象未实现 Serializable,将使用默认的序列化策略,对所有未标记为 NonSerialized 的字段都进行序列化。
时间: 2024-08-11 18:12:20

可序列化和自定义序列化的相关文章

Java Serializable接口(序列化)理解及自定义序列化

  1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化).serialization 不但可以在本机做,而且可以经由网络操作.它自动屏蔽了操作系统的差异,字节顺序等.比如,在 Windows 平台生成一个对象并序列化之,然后通过网络传到一台 Unix 机器上,然后可以在这台Unix机器上正确地重构(deserialization)这个对象. 不必

自定义序列化过程

除了使用事件以外,还可以通过自定义序列化来完成这一过程. 自定义序列化只需要实现ISerializable接口就可以了.它位于using System.Runtime.Serialization; SerializationInfo有点儿类似于BinaryWriter和BinaryReader,用于写入和读取对象的属性值.它主要包括一组AddValue()方法和一组Get<Type>()方法,还有其他一些属性用于获得程序集和类型的信息.StreamingContext则极少使用. 得到和前面类

MSMQ实现自定义序列化存储

http://www.cnblogs.com/smark/archive/2013/05/31/3110208.html 在使用MSMQ的时候一般只会使用默认的XML序列化来对消息进行存储,但XML存储的缺点是序列化体积相对比较大和效率上有点低.其实.net提供非常简单的方式让我们实现不同序列化方式来存储MSMQ信息,如json,protobuf等.为了能够让开发人员实现自定义序列化的消息存储,.NET提供了IMessageFormatter这样一个接口,只需要简单地实现这个接口就可以对MSMQ

黑马程序员——————&gt; 自定义序列化

在一些特殊的场景下,如果一个类里包含的某些实例变量是敏感信息,例如银行账户信息,这时不希望系统将该实例变量值进行实例化:或者某个实例变量的类型是不可序列化的,因此不希望对该实例变量进行递归实例化,以避免引发异常.   通过在实例变量前面使用transient关键字修饰,可以指定java序列化时无须理会该实例变量.如下Person类与前面的Person类几乎完全一样,只是它的age使用了transient关键字修饰. 1 public class Person implements Seriali

如何自定义序列化和反序列化

分析问题 在其他很多编程语言(比如C++)中,实现序列化和反序列化的过程往往需要程序员手动地编写代码.而.NET中提供的Serializable特性却帮助程序员非常便捷地申明一个可序列化的类型.但是,便捷的同时往往意味着缺乏灵活性.很多时候,由于业务逻辑的要求,程序员往往需要主动地控制序列化和反序列化的过程,.NET提供了ISerializable接口来满足自定义序列化需求. 为了实现自定义的序列化和反序列化,程序员需要实现ISerializable接口,并且提供一个特定的在反序列化中构造对象的

.Net Core 自定义序列化格式

序列化对大家来说应该都不陌生,特别是现在大量使用WEBAPI,JSON满天飞,序列化操作应该经常出现在我们的代码上. 而我们最常用的序列化工具应该就是Newtonsoft.Json,当然你用其它工具类也是没问题的,我们重点讲的不是这个工具,我们的重点是高效的可自定义控制的序列化操作. 首先我们说一下大致的序列化原理: 一般情况下,我们把一个实体类,或是数据列表传给工具类(这里我拿Newtonsoft.Json做例子,其它的也是类似的)如: class ClassTest{ public stri

Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称

手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数据,经过分析一个简单的列表接口每一行数据返回了16个字段,但是手机APP端只用到了其中7个字段,剩余9个字段的数据全部都是多余的,如果接口返回数据为40K大小,也就是说大约20K的数据为无效数据,3G网络下20K下载差不多需要1s,不返回无效数据至少可以节约1s的时间,大大提高用户体验.本篇将为大家

自定义序列化

package File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.io.IOException; public class SerializeTest { public static vo

c# 通过json.net中的JsonConverter进行自定义序列化与反序列化

相信大家在工作中会经常遇见对json进行序列化与反序列化吧,但通常的序列化与反序列化中的json结构与c#中的类模型结构是相对应的,我们是否可以在序列化一个对象时候,让我们json的数据结构能按照自己的意愿,而不必与该对象的数据结构一样呢?,比如说,一个对象,只有一个名为"ID"的int类型的属性,值为1,如果序列化该对象,则能得到json:{"ID":1},但我现在希望得到的json的"ID"值是bool类型:{"ID":t