`
boy00fly
  • 浏览: 197824 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

自己动手写写:Java序列化

    博客分类:
  • JVM
 
阅读更多

从以下几个方面来讨论这个问题

 

1、序列化是用来干什么的?

     序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容就行流化。简而言之就是为了保存内存中的各种实例对象的状态,并且可以通过反序列化将实例对象的状态再读出来。

 

2、为什么需要序列化?

为了将对象转换为更加容易传输的格式,减少网络流量的开销。例如,可以序列化一个实例对象,然后使用Http通过Internet在客户端和服务端之间传输该对象,在另外一段,反序列化将从该流中重新构造对象。

 

3、什么情况下需要序列化?

  • 内存中的实例对象状态保存到存储介质时。
  • 内存中的实例对象需要在网络传输时。

4、Java中序列化的实现

Java中只需要一个类implements Serializable即可实现此类的实例对象的序列化。
通过ObjectOutputStream的writeObject方法来实现对象的序列化。通过ObjectInputStream的readObject方法类实现对象的反序列化。

请看下面的一个例子
public class Org
{
    private String orgId;
    
    private String orgName;
    
    /**
     * @return 返回 orgId
     */
    public String getOrgId()
    {
        return orgId;
    }
    
    /**
     * @param 对orgId进行赋值 */
    public void setOrgId(String orgId)
    {
        this.orgId = orgId;
    }
    
    /**
     * @return 返回 orgName
     */
    public String getOrgName()
    {
        return orgName;
    }
    
    /**
     * @param 对orgName进行赋值 */
    public void setOrgName(String orgName)
    {
        this.orgName = orgName;
    }
    
}

 

 

public class User implements Serializable
{   
    /**
     * 注释内容
     */
    private static final long serialVersionUID = -2069026676796654202L;
    
    public static String s = "ssss";

    private String userName;
    
    private String password;
    
    private Org org;
    
    /**
     * @return 返回 org
     */
    public Org getOrg()
    {
        return org;
    }

    /**
     * @param 对org进行赋值 */
    public void setOrg(Org org)
    {
        this.org = org;
    }

    /**
     * @return 返回 userName
     */
    public String getUserName()
    {
        return userName;
    }
    
    /**
     * @param 对userName进行赋值 */
    public void setUserName(String userName)
    {
        this.userName = userName;
    }
    
    /**
     * @return 返回 password
     */
    public String getPassword()
    {
        return password;
    }
    
    /**
     * @param 对password进行赋值 */
    public void setPassword(String password)
    {
        this.password = password;
    }

}
 

 

 
public class UserImpl extends User
{
    
    /**
     * 注释内容
     */
    private static final long serialVersionUID = 418270522532375203L;
    private String confimPassword;

    /**
     * @return 返回 confimPassword
     */
    public String getConfimPassword()
    {
        return confimPassword;
    }

    /**
     * @param 对confimPassword进行赋值 */
    public void setConfimPassword(String confimPassword)
    {
        this.confimPassword = confimPassword;
    }
    
}

 

  <!--------------------------------------------------------------分割线---------------------------------------------------------------!>

 

public class WriteTest
{
    
    /**
     * <一句话功能简述>
     * <功能详细描述>
     * @param args
     * @see [类、类#方法、类#成员]
     */
    public static void main(String[] args)
    {
        User user = new UserImpl();
        user.setUserName("aaa");
        user.setPassword("bbb");
        
        try
        {
            FileOutputStream fos = new FileOutputStream("User.bin");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(user);
            fos.close();
            oos.close();
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
    
}

 

   通过查看序列化后的文件:

   User.bin

 

com.serializable.UserImpl
confimPasswordt
Ljava/lang/String;xr
com.serializable.User
orgt
Lcom/serializable/Org;L
passwordq
userNameq
xppt
bbbt
aaap

 

 我们可以得出以下的结论

 1、序列化的内容包括对象的类型信息、对象的属性信息、对象的属性值信息。而对象的方法信息没有被序列化,静态变量也没有被实例化(这个其实也很好理解,序列化是序列化实例对 象的状态信息,而静态变量是属于类型的信息)。

 2、当一个对象的实例变量引用其他对象,那么序列化该对象也会把引用对象进行序列化。

 3、父类序列化那么子类也自动序列化。

 

如果我们将User类的实现序列化接口去掉,将UserImpl类的实现序列化接口加上去会怎么样呢?

我这里给出结果

 

 

com.serializable.UserImpl
confimPasswordt
Ljava/lang/String;xpp
 

 

我们有没有发现,没有序列化父类的属性以及属性值,我们得出

4、子类序列化,父类没有序列化,则子类序列化时,父类的类型信息、属性以及属性值并不会序列化。

 

 

序列化的其他一些特性比如:Transient 

Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

等等,很多信息都可以参考google,这里给出一个觉得比较容易理解的文章的链接http://www.ibm.com/developerworks/cn/java/j-lo-serial/index.html?ca=drs-

 

 

 

 

 

 

0
2
分享到:
评论

相关推荐

    自己动手写数据库-基于Java语言的简易关系型数据库.zip

    自己动手写数据库--基于Java语言的简易关系型数据库关系型DB从0到1——基于Java语言的简易数据库本项目旨在练习实现一个基于Java语言的简易关系型数据库,用于学习关系型数据库(如Mysql)的设计思想、核心重构、...

    实验前导课:java基础练习上机实验.rar

    通过这个“实验前导课:Java基础练习上机实验”,学生将有机会亲自动手实践以上各个知识点,提升编程技能,为后续深入学习Java打下坚实基础。在实践中遇到问题,可以参考Java官方文档、在线教程和相关书籍,进一步...

    java2实用教程电子教案.pdf

    7. **输入/输出流**:Java的I/O流用于读写文件和网络通信,包括字节流和字符流,以及缓冲流、对象序列化等高级特性。 8. **集合框架**:Java集合框架包含List、Set、Queue和Map接口,以及ArrayList、LinkedList、...

    java教程学习资料

    5. **输入/输出(I/O)**:Java I/O流系统用于读写文件、网络通信等,包括字节流、字符流、缓冲流和对象序列化。 6. **多线程**:Java内置对多线程的支持,可以同时执行多个代码段,提高程序效率。 7. **网络编程*...

    java学习资料(160多个java实例)

    实例可能包含文件读取、字符流、字节流和对象序列化的例子。 8. **多线程**:Java提供了丰富的多线程支持,包括Thread类和Runnable接口。实例可能涉及线程的创建、同步和通信。 9. **网络编程**:Java Socket编程...

    java Beans开发使用手册(PDG)

    Java Beans的核心概念是封装、可序列化和属性、事件与方法的交互。 首先,让我们深入了解Java Beans的基本特征: 1. **封装**:Java Beans遵循面向对象原则,将数据和操作数据的方法封装在一起。它们通常包含一组...

    JAVA经典100例

    这在许多高级应用场景中必不可少,如插件开发、序列化等。 通过深入研究"JAVA经典100例"中的每一个案例,你不仅可以掌握JAVA语言的基本用法,还能了解到JAVA在实际开发中的应用策略。每个例子都是一个独立的学习...

    《疯狂Java讲义》书籍光盘源代码

    5. **IO流**:Java的I/O流系统支持读写文件、网络通信等操作,源码中会有文件读写、对象序列化、过滤流等实例。 6. **多线程**:Java提供了丰富的多线程编程机制,如Thread类、Runnable接口、synchronized关键字、...

    java自学小课程(附源码)

    6. **输入/输出(I/O)**:Java的I/O流系统用于读写文件、网络通信等,包括字节流和字符流,以及缓冲区和对象序列化等概念。 7. **多线程**:Java内置了对多线程的支持,你可以创建Thread对象或者实现Runnable接口...

    java基础开发与案例详解代码

    标准输入输出、文件输入输出流、对象序列化等都是重要的IO概念,这些代码将帮助你理解和应用它们。 7. **多线程**:Java内置了对多线程的支持,你可以创建和管理多个执行线程,实现并发处理。同步机制如...

    Java语言程序设计进阶篇(第5版)源代码

    3. **I/O流**:Java的I/O流体系结构复杂而强大,源代码中可能涵盖了文件读写、对象序列化、管道流、缓冲流和转换流的使用,以及NIO(非阻塞I/O)的相关示例。 4. **集合框架**:Java集合框架包括List、Set、Map等...

    Java语言程序设计(完整版)第六版 教程示例源码

    5. **IO流**:学习如何使用Java的输入输出系统,包括文件读写、对象序列化、字节流和字符流的操作,以及NIO(New IO)框架。 6. **多线程**:Java提供了内置的多线程支持。示例源码会展示如何创建和管理线程,同步...

    Thinking in java 电子书

    5. **输入/输出(I/O)系统**:Java的I/O系统包括文件操作、流、序列化等。书中详细讨论了如何读写文件,使用不同类型的流进行数据传输,以及如何序列化和反序列化对象。 6. **多线程**:Java提供了强大的多线程...

    java学习代码自学代码

    "javastudy"可能包含了文件读写、对象序列化和反序列化的例子。 5. **多线程**:Java提供了强大的多线程支持,你可以学习如何创建和管理线程,理解同步和互斥的概念,以及死锁和活锁问题的处理。 6. **网络编程**...

    JAVA案例开发集锦

    案例会涵盖字节流、字符流、缓冲流、对象序列化等内容,帮助我们理解如何高效地处理数据输入输出。 5. **多线程**:Java的并发编程是其强大之处。案例将展示如何创建和管理线程,使用同步机制(如synchronized...

    达内的javappt

    6. **输入/输出(I/O)**:了解流的概念,学习如何进行文件读写,网络通信,以及序列化和反序列化。 7. **多线程**:Java提供了丰富的多线程支持,包括线程的创建、同步、协作以及线程池的使用。 8. **反射**:...

    java清华大学教程

    9. **反射机制**:Java的反射机制允许在运行时动态获取类的信息并调用方法,是许多高级功能如插件系统、序列化、动态代理的基础。 10. **JVM原理**:了解Java虚拟机的工作原理,包括类加载、内存管理、垃圾回收等,...

    java课件ppt经典学习

    6. **输入/输出(I/O)**:Java的I/O流用于读写文件、网络通信,初学者会学习InputStream和OutputStream类,以及更高级的缓冲流和对象序列化。 7. **多线程**:Java内置对多线程的支持,课件会讲解Thread类和Runnable...

    Java2范例入门与提高光盘

    光盘可能包含文件操作、字节流、字符流、对象序列化等内容。 6. **多线程**:Java支持多线程编程,可以创建并发执行的任务。光盘可能涵盖Thread类、Runnable接口、同步机制(synchronized关键字,wait(),notify()...

Global site tag (gtag.js) - Google Analytics