`

java编程思想笔记(十六)对象序列化

阅读更多

java对象序列化是将对象转化成一个字节序列,一般是将对象实现Serializable接口来实现对象序列化,序列化后,可以通过网络传输数据,也能存在数据库或硬盘中。

反序列化则是字节序列转为JAVA对象

 

下面是实现Serializable接口后对象序列化和反序列化的栗子:

 

import java.io.*;  
  
public class TestObject implements Serializable{}  
  
import java.io.*;  
  
//序列化  
public class SerializeObject{  
    public static void main(String[] args)throws Exception{  
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(“x.file”));  
        TestObject obj = new TestObject();  
        //将TestObject对象序列化到x.file文件中  
        out.write(obj);  
}  
}  
  
import java.io.*;  
  
//反序列化  
public class DeserializeObject{  
    public static void main(String[] args)throw Exception{  
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(“x.file”));  
        Object myObj = in.readObject();  
        System.out.println(myObj.getClass());  
}  
}  
 输出结果:

 

class TestObject

在序列化时,使用ObjectOutputStream将对象序列化写出,反序列化时,使用ObjectInputStream将对象反序列化读入。

注意:反序列化对象使用时,对象的class文件必须在classpath中,否则,JVM找不到对象的class文件会抛出ClassNotFoundException。

 

2.序列化控制

用Serializable会把整个对象都给序列化,使用Externalizable则把对象部分序列化,Externalizable需要实现2个方法,一个是writeExternal(ObjectOutput out),另一个是readExternal(ObjectInput in),把你想序列化的对象写在writeExternal方法中,反序列化的对象写在readExternal方法中,在对象序列化和反序列化过程中,这两个方法会自动调用。

 

import java.io.*;  
  
class Blip1 implements Externalizable{  
    public Blip1(){  
        System.out.println(“Blip1 Constructor”);  
}  
public void writeExternal(ObjectOutput out)throws IOException{  
    System.out.println(“Blip1.writeExternal”);  
}  
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException{  
    System.out.println(Blip1.readExternal);  
}  
}  
  
class Blip2 implements Externalizable{  
    Blip1(){  
        System.out.println(“Blip2 Constructor”);  
}  
public void writeExternal(ObjectOutput out)throws IOException{  
    System.out.println(“Blip2.writeExternal”);  
}  
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException{  
    System.out.println(Blip2.readExternal);  
}  
}  
  
public class Blips{  
    public static void main(String[] args)throws IOException, ClassNotFoundException{  
        System.out.println(“Constructing objects:”);  
        Blip1 b1 = new Blip1();  
        Blip2 b2 = new Blip2();  
        //序列化  
        ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(“Blips.out”));  
        System.out.println(“Saving objects:”);  
        o.writeObject(b1);  
        o.writeObject(b2);  
        //反序列化  
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(“Blips.out”));  
        System.out.println(“Recovering b1:”);  
        b1 = (Blip1)in.readObject();  
        //由于Blip2的默认无参数构造方法不是public的,所以会抛异常  
        //System.out.println(“Recovering b2:”);  
        //b2 = (Blip2)in.readObject();  
}  
}  

 

输出结果:

Constructing objects:

Blip1 Constructor

Blip2 Constructor

Saving objects:

Blip1.writeExternal

Blip2.writeExternal

Recovering b1:

Blip1 Constructor

Blip1.readExternal

 

3.Externalizable指定部分字段初始化

用writeExternal()和readExternal()可指定所需字段去初始化,不需要的则不初始化

import java.io.*;  
  
public class Test implements Externalizable{  
    private int i;  
    private String s;  
    public Test(){  
        System.out.println(“Test Constructor”);  
}  
public Test(String x, int a){  
    System.out.println(“Test(String x, int a)”);  
    i = a;  
    s = x;  
}  
public void toString(){  
    return s + i;  
}  
public void writeExternal(ObjectOutput out)throws IOException{  
    System.out.println(“Test.writeExternal”);  
    out.writeObject(s);  
    out.writeInt(i);  
}  
public void readExternal(ObjectInput in)throws IOException, ClassNotFoundException{  
    System.out.println(“Test.readExternal”);  
    s = (String)in.readObject();  
    i = in.readInt();  
}  
public static void main()throws IOException, ClassNotFoundException{  
    System.out.println(“Constructing objects:”);  
    Test t1 = new Test(“A String”, 47);  
    Test t2 = new Test();  
    System.out.println(t1);  
    System.out.println(t2);  
    //序列化  
    ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(“Test.out”));  
    System.out.println(“Saving objects:”);  
    o.writeObject(t1);\  
    o.writeObject(t2);  
    o.close();  
    //反序列化  
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(“Test.out”));  
    System.out.println(“Recovering objects:”);  
    t1 = (Test)in.readObject();  
    System.out.println(t1);  
    t2 = (Test)in.readObject();  
    System.out.println(t2);  
}  
}  

 

输出结果:

Constructing objects:

Test(String x, int a)

A String 47

Test Constructor

null0

Saving objects:

Test.writeExternal

Test.writeExternal

Recovering objects:

Test Constructor

Test.readExternal

A String 47

Test Constructor

Test.readExternal

null 0

 

该例子中,当创建对象使用非无参数构造方法时,对象字段被初始化,因此序列化时可以将初始化的值保存。当创建对象使用无参数的构造方法时,对象的字段没有被赋值而使用默认的初始化值。t1使用readExternal()反序列化时因为没有参数,所以会调用默认构造器.

 

4.transient关键字:

当类中某些字段不想被序列化,就需要使用transient关键字,适用于自动序列化的Serializable , Externalizable可通过writeExternal()方法也可以实现此功能.

例子如下:

import java.io.*;  
  
public class User implements Serializable{  
    private String username;  
    private transient String password;  
    public User(String name, String pwd){  
        username = name;  
        password = pwd;  
}  
public String toString(){  
    return “username:” + username + “, password:” + password;  
}  
public static void main(String[] args)throws Exception{  
    User user = new User(“Test”, “passwd”);  
    System.out.println(“User=” + user);  
    ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(“User.out”));  
    o.writeObject(user);  
    o.close();  
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(“User.out”));  
    System.out.println(“Recovering object:”);  
    user = (User)in.readObject();  
    System.out.println(“User=” + user);  
}  
}  

 

输出结果:

User=username:Test,password:passwd

Recovering object:

User=username:Test,password:null

 

 

 

分享到:
评论

相关推荐

    Java编程思想笔记(全)

    ### Java编程思想笔记知识点概述 #### 第 1 章 对象导论 在这一章节中,主要介绍了Java中的基本概念——对象。对象是面向对象编程的核心,它封装了数据和行为。本章首先解释了对象的概念,接着讨论了如何创建对象...

    Java编程思想学习笔记

    在讨论Java编程思想学习笔记时,首先需要了解的是Java语言的平台无关性,而这一特性正是通过Java虚拟机(JVM)得以实现的。JVM作为Java程序设计的关键组成部分,对于Java开发人员来说是必须掌握的基础知识。在该学习...

    达内JAVA培训综合笔记

    面向对象是Java编程的核心思想,笔记中对类、对象、包、方法及其调用、引用、访问控制、构造器、继承、接口等概念都进行了深入讲解。特别是继承和多态的概念,是理解Java面向对象程序设计的关键。此外,还涵盖了抽象...

    JAVA经典教材笔记

    - Java作为一种广泛使用的编程语言,其学习路径包括掌握基本语法、理解面向对象编程思想、熟悉标准库使用等。 - **JAVA发展概述** - Java的发展历程:从1995年由Sun Microsystems公司发布以来,Java经历了多次重大...

    java私塾学习笔记整理

    ### Java私塾学习笔记整理 #### 第一章:Java入门 ...以上内容涵盖了Java基础知识的重要方面,从语言基础到高级特性,以及常见的开发技术和工具,帮助读者全面了解Java编程的基础知识和技术要点。

    张龙 java se课程笔记

    6.3 对象序列化:将对象转换为字节流进行存储或传输。 七、多线程 7.1 线程基础:理解线程的概念,创建线程的两种方式(继承Thread类和实现Runnable接口)。 7.2 线程同步:synchronized关键字、wait()、notify()和...

    很好的JAVA课堂笔记

    ### JAVA课堂笔记精要 #### JVM与Java执行过程 Java程序的执行依赖于JVM(Java虚拟机),它是运行Java字节码的标准平台。...通过深入学习这些知识点,可以更好地理解和掌握Java编程的核心思想和技术要点。

    编程思想读书笔记.docx

    基础类型如`int`、`char`直接存储值,而它们的包装类如`Integer`、`Character`是对象,可以支持更多的高级功能,如比较、序列化等。在实体类中,如果你的属性不需要这些额外功能,通常使用基础类型以节省内存和提高...

    core java培训学习笔记

    9. **反射机制**:学习如何在运行时获取类的信息,动态创建和调用对象,这在很多高级功能如插件化、序列化中都有应用。 10. **枚举和注解**:了解枚举类型的作用和用法,以及注解(Annotation)在元编程中的重要性...

    java学习笔记整理

    为了开发软件,需要选择合适的计算机语言、开发工具以及编程思想。计算机语言主要分为三类:机器语言、汇编语言和高级语言。高级语言是面向用户的编程语言,它更接近人类自然语言,易于理解和编写。常见的高级语言有...

    CoreJava学习笔记

    Java中可以使用Serializable接口来实现对象的序列化和反序列化。 **I/O流基础:** Java中I/O流用于处理输入输出操作,包括文件、网络等。 **流的分类:** 流可以分为字节流和字符流两大类。 **I/O输入输出:** ...

    java笔记图解7

    【Java笔记图解7】是针对Java编程语言的学习资料,主要涵盖了Java的进阶概念和实践技巧。在这一部分的学习中,我们将会深入探讨Java的核心特性,包括面向对象编程、异常处理、集合框架、多线程以及IO流等方面的知识...

    韩顺平_java设计模式笔记

    在Java中,可以通过重写`clone()`方法实现深拷贝,或者利用序列化和反序列化进行深拷贝。Spring框架中,`prototype`作用域的bean创建就是原型模式的应用,例如`...

    韩顺平_Java设计模式笔记.docx

    - **使用序列化实现深拷贝**:将对象序列化为字节流,再从字节流中反序列化出新的对象实例。 - **源码示例**: ```java public class DeepClone implements Cloneable { private String name; private ...

    java基础知识笔记总结

    - 面向对象是一种编程思想,它将现实世界中的事物抽象为对象,通过对象的交互来完成程序设计。 2. **类** - 类是具有相同特征的对象的抽象,是创建对象的模板。 3. **构造方法** - 构造方法用于初始化对象,其...

    [Java学习笔记doc]-javase基本知识

    - Java I/O系统支持对文件、网络、内存等的数据读写,包括字节流和字符流,以及缓冲、转换和对象序列化等功能。 7. **多线程** - Java内置了对多线程的支持,通过`Thread`类或实现`Runnable`接口创建并管理线程。...

    Java学习笔记及其与C++的比较

    - **Persistence**:Java支持序列化,使得对象的状态可以持久化到磁盘。 - **名字空间控制**:Java使用包名,而C++使用namespace。 - **字符串比较**:Java中字符串对象使用equals()方法进行比较,而不是==。 - **...

    传智java基础

    "Java基础[07-IO].ppt"会涉及Java的I/O流,包括文件操作、字节流、字符流、缓冲流和对象序列化等,这些都是进行数据读写和网络通信的基础。 **七、网络编程** "Java基础[08-网络编程].ppt"可能涵盖了Socket编程、...

    java详细笔记

    Java是一种广泛使用的面向对象的编程...这份笔记详尽地介绍了Java编程语言的各个方面,无论是初学者还是有经验的开发者,都能从中获得宝贵的启示和知识。通过深入学习和实践,可以为实际的软件开发工作打下坚实的基础。

Global site tag (gtag.js) - Google Analytics