`
wsmajunfeng
  • 浏览: 496954 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

序列化与克隆

阅读更多
一、序列化
   Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的序列化机制是RMI、EJB等技术的技术基础。
    当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
    把Java对象转换为字节序列的过程称为对象的序列化
    把字节序列恢复为Java对象的过程称为对象的反序列化
1、序列化的用途
    利用对象的序列化可以保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。
     对象的序列化主要有两种用途:
(a) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
(b) 在网络上传送对象的字节序列。
2、序列化的实现
(1)JDK类库中的序列化API
    java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
     java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
     只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式 。
(2)对象序列化与反序列化的过程
     将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
     对象序列化包括如下步骤:
(a)创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
(b)通过对象输出流的writeObject()方法写对象。
     对象反序列化的步骤如下:
(a)创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
(b)通过对象输入流的readObject()方法读取对象。
     下面让我们来看一个对应的例子,类的内容如下:

import java.io.*; 
import java.util.Date; 
public class ObjectSaver { 
          public static void main(String[] args) throws Exception { 
              ObjectOutputStream out = new ObjectOutputStream 
                     (new FileOutputStream("D:""objectFile.obj")); 
              //序列化对象 
              Customer customer = new Customer("阿蜜果", 24); 
              out.writeObject("你好!"); 
              out.writeObject(new Date()); 
              out.writeObject(customer); 
              out.writeInt(123); //写入基本类型数据 
              out.close(); 
              //反序列化对象 
              ObjectInputStream in = new ObjectInputStream 
                     (new FileInputStream("D:""objectFile.obj")); 
              System.out.println("obj1=" + (String) in.readObject()); 
              System.out.println("obj2=" + (Date) in.readObject()); 
              Customer obj3 = (Customer) in.readObject(); 
              System.out.println("obj3=" + obj3); 
              int obj4 = in.readInt(); 
              System.out.println("obj4=" + obj4); 
              in.close(); 
       } 
} 
class Customer implements Serializable { 
       private String name; 
       private int age; 
       public Customer(String name, int age) { 
              this.name = name; 
              this.age = age; 
       } 
       public String toString() { 
              return "name=" + name + ", age=" + age; 
       } 
} 

      输出结果如下:
obj1=你好! 
obj2=Sat Sep 26 22:02:21 CST 2010 
obj3=name=阿蜜果, age=24 
obj4=123 

      因此例比较简单,在此不再详述。
3、serialVersionUID作用:
      序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
       有两种生成方式:
       一个是默认的1L,比如:
private static final long serialVersionUID = 1L; 

       一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final   long      serialVersionUID = xxxxL;

二、克隆
      有时想得到对象的一个复制品,该复制品的实体是原对象实体的克隆。复制品实体的变化不会引起原对象实体发生变化,这样的复制品称为原对象实体的克隆对象或简称克隆。
1、浅复制(浅克隆
      概念:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
      方法:类implements Cloneable,然后重写clone()方法,在clone()方法中调用super.clone()即可,没有其他操作了
2、深复制(深克隆
      概念:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍
      方法:(1)类implements Cloneable,然后重写clone()方法,在clone()方法中调用super.clone(),然后还要对引用型变量所指的对象进行克隆。(2)序列化:将该对象写出到对象输出流,那么用对象输入流读回的对象就是原对象的一个深度克隆。

分享到:
评论

相关推荐

    KryoJava序列化和克隆框架具有快速高效自动的特点

    **Kryo:Java世界的序列化与克隆框架** 在Java开发中,序列化是一个至关重要的概念,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。Kryo是一个针对Java的高性能对象图序列化框架,由Esoteric ...

    关于 Java 对象序列化您不知道的 5 件事

    序列化涉及将对象转换为字节流,而克隆是直接创建一个与原对象具有相同属性的新对象,通常通过实现`Cloneable`接口并覆盖`clone()`方法来实现。 9. **序列化框架** 除了Java内置的序列化机制,还有许多第三方框架...

    克隆和序列化(Java )

    在Java编程语言中,克隆和序列化是两个重要的概念,它们在数据处理和对象管理中扮演着关键角色。下面将分别对这两个概念进行详细解释,并结合实例和源代码进行阐述。 **一、克隆** 1. **克隆定义**:克隆是指创建...

    关于Java对象序列化您不知道的5件事Java开发Java

    11. **序列化与克隆的区别**: 序列化和对象的浅复制(克隆)都是保存对象状态的方式,但两者有本质区别。序列化是将整个对象转换为字节流,而克隆是创建对象的一个副本,通常只复制对象的直接属性,不涉及深层引用...

    java序列化和反序列化的方法

    java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在...

    序列化与持久化相同点跟不同点

    ### 序列化与持久化的相同点与不同点 #### 一、持久化定义与应用场景 **持久化**是指将程序中的数据(如内存中的对象)保存到可长期存储的设备上,比如硬盘或者固态硬盘等。持久化的主要目的是确保即使在程序结束...

    Java中对象的序列化方式克隆详解

    深克隆通过序列化和反序列化实现,首先将对象写入`ByteArrayOutputStream`,然后从`ByteArrayInputStream`中读取,从而创建一个新的对象。这种方式可以确保对象及其引用的所有对象都被复制,形成一个新的独立的实例...

    java序列化原理与算法

    ### Java序列化原理与算法详解 #### 序言 在现代软件开发中,尤其是在网络通信和数据持久化领域,对象的序列化与反序列化扮演着至关重要的角色。Java作为一种广泛应用的编程语言,提供了强大的内置支持来实现序列化...

    Java对象序列化

    3. **对象克隆**:通过序列化和反序列化实现对象的深度克隆。 4. **缓存机制**:将对象状态存储到磁盘或内存中,以提高性能。 #### 三、序列化实现机制 Java提供了两种主要的序列化方式: 1. **标准序列化**(`...

    swift-Swift的MsgPack序列化和反序列化器

    在Swift中,使用MsgPack进行序列化和反序列化能够提高应用性能,因为与JSON等文本格式相比,二进制格式通常占用更少的空间,处理速度更快。 MsgPack的核心概念包括基本类型(如整数、浮点数、布尔值和字符串)以及...

    JAVA浅克隆与深克隆

    在Java中,深克隆通常通过序列化和反序列化来实现,或者手动创建一个新的对象并复制所有字段。下面是一个使用序列化实现深克隆的例子: ```java import java.io.*; // 在Student类中添加序列化和反序列化方法 ...

    java中对象的序列化与反序列化深入讲解

    3. **深度克隆**:通过序列化和反序列化,可以实现对象的深拷贝,即创建一个与原对象完全相同的新对象,其内部状态与原对象一致,不受原对象后续修改的影响。 在实际使用中,需要注意的是,序列化可能会暴露对象的...

    java.io.Serializable序列化问题

    #### 一、序列化的概念与作用 在 Java 编程语言中,序列化是一种将对象的状态(即成员变量的值)转换为可以存储或传输的形式的过程。通常,这种形式是字节流,但也可以是其他格式,如 XML 或 JSON 等。序列化的主要...

    java序列化

    - **对象克隆**:通过序列化和反序列化来实现对象的深度克隆。 #### 三、实现序列化的步骤 要使一个Java类支持序列化,最简单的方法是让它实现`java.io.Serializable`接口。实现此接口的类意味着它可以被序列化。 ...

    Java编程规则教程

    - **序列化与克隆**:通过实现`Serializable`接口,可以支持对象的序列化,这对于数据持久化和网络传输至关重要。 #### 主函数与程序入口 - **主函数设计**:每个Java应用程序都应包含一个`main()`方法作为执行的...

    java深度克隆

    3. **安全性问题**:使用序列化实现深度克隆可能会存在安全风险,例如反序列化恶意构造的数据可能导致代码执行等安全漏洞。 4. **实现限制**:只有实现了`Serializable`接口的类才能被正确地序列化和反序列化。 ###...

    Java对象(最后面是序列化的知识)1

    Java编程语言中,对象的创建和管理涉及到一系列...总结来说,Java对象的生命周期涉及类加载、初始化,以及对象的创建、克隆、序列化和反序列化等步骤,每一步都可能需要特定的处理和优化,以满足不同的需求和安全考虑。

    JAVA面试笔试题汇总-5

    #### 六、序列化与克隆 1. **序列化**:将对象的状态转换为字节流的过程,以便保存到磁盘或在网络上传输。 2. **克隆**:通过`Cloneable`接口和`clone()`方法实现对象的浅拷贝。需要注意的是,克隆过程中需要手动...

Global site tag (gtag.js) - Google Analytics