`

序列化,实体类存在memcache中必须要序列化

 
阅读更多
转westlifesz的博文

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

序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
是对象永久化的一种机制。

   确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。

   只有序列化的对象才可以存储在存储设备上。为了对象的序列化而需要继承的接口也只是一个象征性的接口而已,也就是说继承这个接口说明这个对象可以被序列化了,没有其他的目的。之所以需要对象序列化,是因为有时候对象需要在网络上传输,传输的时候需要这种序列化处理,从服务器硬盘上把序列化的对象取出,然后通过网络传到客户端,再由客户端把序列化的对象读入内存,执行相应的处理。

   对象序列化是java的一个特征,通过该特征可以将对象写作一组字节码,当在其他位置读到这些字节码时,可以依此创建一个新的对象,而且新对象的状态与原对象完全相同。为了实现对象序列化,要求必须能够访问类的私有变量,从而保证对象状态能够正确的得以保存和恢复。相应的,对象序列化API能够在对象重建时,将这些值还原给私有的数据成员。这是对java语言访问权限的挑战。通常用在服务器客户端的对象交换上面,另外就是在本机的存储。

   对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口 。
*
Quote:


比较java.io.Externalizable和java.io.Serializable
http://www.zdnet.com.cn/developer/code/story/0,3800066897,39304080,00.htm

即使你没有用过对象序列化(serialization),你可能也知道它。但你是否知道 Java 还支持另外一种形式的对象持久化,外部化(externalization)?

下面是序列化和外部化在代码级的关联方式:

public interface Serializable {}

public interface Externalizable extends Serializable {
void readExternal(ObjectInput in);
void writeExternal(ObjectOutput out);
}

序列化和外部化的主要区别

外部化和序列化是实现同一目标的两种不同方法。下面让我们分析一下序列化和外部化之间的主要区别。

通过Serializable接口对对象序列化的支持是内建于核心 API 的,但是java.io.Externalizable的所有实现者必须提供读取和写出的实现。Java 已经具有了对序列化的内建支持,也就是说只要制作自己的类java.io.Serializable,Java 就会试图存储和重组你的对象。如果使用外部化,你就可以选择完全由自己完成读取和写出的工作,Java 对外部化所提供的唯一支持是接口:

voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)

现在如何实现readExternal() 和writeExternal() 就完全看你自己了。

序列化会自动存储必要的信息,用以反序列化被存储的实例,而外部化则只保存被存储的类的标识。当你通过java.io.Serializable接口序列化一个对象时,有关类的信息,比如它的属性和这些属性的类型,都与实例数据一起被存储起来。在选择走Externalizable这条路时,Java 只存储有关每个被存储类型的非常少的信息。

每个接口的优点和缺点

Serializable接口

· 优点:内建支持

· 优点:易于实现

· 缺点:占用空间过大

· 缺点:由于额外的开销导致速度变比较慢

Externalizable接口

· 优点:开销较少(程序员决定存储什么)

· 优点:可能的速度提升

· 缺点:虚拟机不提供任何帮助,也就是说所有的工作都落到了开发人员的肩上。

在两者之间如何选择要根据应用程序的需求来定。Serializable通常是最简单的解决方案,但是它可能会导致出现不可接受的性能问题或空间问题;在出现这些问题的情况下,Externalizable可能是一条可行之路。

要记住一点,如果一个类是可外部化的(Externalizable),那么Externalizable方法将被用于序列化类的实例,即使这个类型提供了Serializable方法:

private void writeObject()
private void readObject()

分享到:
评论

相关推荐

    memcache-session序列化

    tomcat kryo memcache session序列化 msm-memcached-session-manager-1.8.2

    memcache实现java客户端

    6. **存储数据**:在Memcache中存储数据是通过键值对完成的。例如,存储一个字符串: ```java client.set("key", 60, "value"); // key是键,60是过期时间(秒),value是要存储的值 ``` 7. **检索数据**:获取...

    memcache使用手册

    * Memcache 中的值可以是任何类型的数据,但需要能够被序列化。 * Memcache 中的缓存政策可以根据需要进行设置,例如设置缓存的过期时间或缓存的最大大小。 Memcache 是一种非常有用的技术,它可以帮助应用程序提高...

    深入解析PHP中SESSION反序列化机制

    在自定义的session存储中,开发者可以设置`session.serialize_handler`来改变序列化和反序列化数据的方式。例如,`php_serialize`处理器使用PHP内置的序列化机制来存储会话数据,而`php`处理器则在序列化的数据前后...

    tomcat7 通过memcache 实现 session共享依赖包

    在这个场景中,Kryo可能用于序列化session对象以便于在Memcache中存储。 3. **memcached-session-manager-2.0.0.jar**:这是Memcached Session Manager的核心库,它负责处理session的存储、恢复和过期策略,使得...

    ThinkPHP v3.2.X(SQL注入&文件读取)反序列化POP链1

    首先,我们要了解反序列化漏洞的基本概念。在PHP中,序列化是将对象转换为字符串的过程,以便存储或传输;反序列化则是将字符串恢复为原来的对象。当反序列化的数据不受严格验证时,攻击者可能注入恶意代码,从而...

    MemCache Client端类库

    3. **数据序列化与反序列化**:由于MemCache仅支持二进制数据,客户端需要负责将C++对象序列化为字节流,以及反序列化回对象。 4. **缓存策略**:根据业务需求,实现缓存失效策略,如LRU(最近最少使用)、TTL...

    php之Memcache的使用

    - 序列化与反序列化:默认情况下,PHP的Memcache扩展会自动处理数据的序列化和反序列化,允许存储复杂数据结构如数组和对象。 - 自动压缩:当数据超过一定大小时,Memcache会自动进行压缩,以节省内存空间。 **5. ...

    集群环境下memcache解决session共享

    3. `SerializationStrategy`:session数据通常需要序列化才能存储在memcache中,因此需要一种策略来处理Java对象到字节流的转换,以及字节流到Java对象的反序列化。 4. 配置文件:为了配置memcache session管理器,...

    thinkphp5.0反序列化链小记.pdf

    - 上述payload中涉及到了多个类和方法的嵌套使用,最终目的是为了在反序列化过程中执行`@riny($CBFG[1])`这行代码,其中`$CBFG`是一个预定义的变量,通常由框架内部设置,用于存储反序列化后的对象。 #### 四、总结...

    php7的memcache.dll文件

    - **序列化和反序列化**:由于Memcache仅支持字符串类型,因此在存储复杂数据结构时,需要先进行序列化处理。 总结,PHP7的memcache.dll文件是Windows环境下PHP7与Memcache服务通信的桥梁,对于利用Memcache提升...

    memcacheclient-2.0

    此外,`memcacheclient-2.0`还提供了丰富的API接口,包括设置、获取、删除、批量操作等多种功能,同时支持自定义序列化和反序列化策略,以适应不同数据类型的存储需求。这些API设计简洁明了,易于理解和使用,使得...

    Memcache Session Manager + Tomcat8.5.6

    在Memcache中,使用Kryo可以提高序列化和反序列化的效率,减少网络传输的开销。 6. **集群配置**: 在Memcache中,可以通过创建集群来提高容错性和可扩展性。当一台Memcache服务器出现问题时,其他服务器仍能继续...

    tomcat6 memcache session manager session共享 jar包下载

    3. `serialization-support.jar`: 由于Session对象通常需要序列化才能存储在Memcache中,这个库可能提供了必要的序列化和反序列化功能。 4. `transcoder.jar`: 可能包含了对不同类型数据进行编码和解码的类,以便...

    memcache1.2.1 for windows

    1. **数据持久性**:Memcache不支持数据持久化,断电或重启后数据丢失,适用于临时存储。 2. **内存管理**:合理设置最大内存,防止因内存耗尽导致的服务器问题。 3. **并发竞争**:在多线程或多进程环境下,需注意...

    memcache分布式缓存操作类

    这是一个php的memcache操作类可以下载看一下

    memcache所需要的jar包

    - 为了确保高效性,应避免在Memcache中存储过大的数据对象,因为内存缓存的初衷是快速访问小数据片段。 - 考虑使用一致性哈希策略来平衡Memcache集群中的数据分布,防止数据丢失或重复。 - 定期检查并清理不再...

    php中Memcache操作类使用

    要从缓存中检索数据,可以使用`Memcache::get()`函数,传入相应的键。 ```php $cachedData = $memcache->get('myKey'); echo $cachedData; // 输出:Hello, Memcache! ``` 4. **删除缓存** 使用`Memcache::...

    自己写的一个php memcache操作类

    标题中的“自己写的一个php memcache操作类”指的是一个自定义的PHP类,用于与Memcached缓存系统进行交互。Memcached是一种广泛使用的分布式内存对象缓存系统,它能够提高Web应用的性能,通过存储数据在内存中,避免...

    php的memcache类分享(memcache队列)

    在给定的文件内容中,我们看到了一个名为memcacheQueue的PHP类的示例代码,这个类是为了在Memcache中实现一个队列功能。以下是该类中涉及的主要知识点: 1. Memcache队列类的创建和配置: 在PHP中使用Memcache队列...

Global site tag (gtag.js) - Google Analytics