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

java序列化之保存对象到文件中

阅读更多

java源码:
import java.io.*;

public class LoginUser {
 private String username;
 private String passwd;
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPasswd() {
  return passwd;
 }
 public void setPasswd(String passwd) {
  this.passwd = passwd;
 }
 
 public static void main(String[] args){  
  LoginUser loginUser = new LoginUser();  
  loginUser.setUsername("50");  
        loginUser.setPasswd("30");  
  
        try{  
            FileOutputStream fs = new FileOutputStream("foo.ser");  
            ObjectOutputStream os =  new ObjectOutputStream(fs);  
            os.writeObject(loginUser);  
            os.close();  
        }catch(Exception ex){  
            ex.printStackTrace();  
        }  
    }  

}

报错如下:

java.io.NotSerializableException: com.longshine.zwp.test.LoginUser
 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
 at com.longshine.zwp.test.LoginUser.main(LoginUser.java:29)

 

类的定义改成如下:

public class LoginUser implements Serializable{

}

则可以保存下来内存中的java对象。

 

1、序列化是干什么的?
       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

2、什么情况下需要序列化  
    a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;

3、当对一个对象实现序列化时,究竟发生了什么?
    在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
   

java 代码
  1. Foo  myFoo = new Foo();  
  2. myFoo .setWidth(37);  
  3. myFoo.setHeight(70);  

     
       当 通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。

java 代码
  1. FileOutputStream fs = new FileOutputStream("foo.ser");  
  2. ObjectOutputStream os = new ObjectOutputStream(fs);  
  3. os.writeObject(myFoo);  


4、实现序列化(保存到一个文件)的步骤
      
a)Make a FileOutputStream                    b)Make a ObjectOutputStream           

java 代码
  1. FileOutputStream fs = new FileOutputStream("foo.ser");    

 

java 代码
  1. ObjectOutputStream os =  new ObjectOutputStream(fs);   

       c)write the object

java 代码
  1. os.writeObject(myObject1);  
  2. os.writeObject(myObject2);  
  3. os.writeObject(myObject3);  

    d) close the ObjectOutputStream

java 代码
  1. os.close();  



5、举例说明

6、相关注意事项
    a)序列化时,只对对象的状态进行保存,而不管对象的方法;
    b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
    c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
    d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
        1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输  等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
       2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分  配,而且,也是没有必要这样实现。

java 代码


import java.io.*;
public class LoginUser implements Serializable{
 /**
  *
  */
 private static final long serialVersionUID = -4382915422537471820L;
 private String username;
 private String passwd;
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPasswd() {
  return passwd;
 }
 public void setPasswd(String passwd) {
  this.passwd = passwd;
 }
 
 public static void save() {
  LoginUser loginUser = new LoginUser();
  loginUser.setUsername("50");
  loginUser.setPasswd("30");
  try {
   FileOutputStream fs = new FileOutputStream("loginuser.txt");
   ObjectOutputStream os = new ObjectOutputStream(fs);
   os.writeObject(loginUser);
   os.flush();
   os.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
 
 public static void read() {
  try {
   FileInputStream fs = new FileInputStream("loginuser.txt");//("foo.ser");
   ObjectInputStream ois = new ObjectInputStream(fs);
   LoginUser loginUser = (LoginUser) ois.readObject();
   System.out.println(loginUser.getUsername() + "----"
     + loginUser.getPasswd());
   ois.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
 
 public static void main(String[] args){  
       save();
       read();
    }  
}

 序列化、反序列化为XML文件,使用XStream来序列化,需要引入xstream-1.3.1.jar包的支持,
http://xstream.codehaus.org/download.html  处可以下载jar,然后引入到Eclipse中的build path中。
Serialize.java的代码如下:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import com.thoughtworks.xstream.*;

public class Serialize {
    public static void main(String[] args) {
        Serialize ser = new Serialize();
        ser.serializeToXml();
        ser.deSerializeFromXml();
    }
   
public void serializeToXml(){
        Person[] myPerson = new Person[2];
        myPerson[0] = new Person("Jay",24);
        myPerson[1] = new Person("Tom",23);
       
        XStream xstream = new XStream(); 
        try {
            FileOutputStream fos = new FileOutputStream("E:\\workspace\\2010_03\\src\\myPerson.xml");
             xstream.toXML(myPerson,fos);
             } catch (FileNotFoundException ex) {
             ex.printStackTrace();
             }      
        System.out.println(xstream.toXML(myPerson));
    }
    public void deSerializeFromXml(){
         XStream xs = new XStream();
         Person[] myPerson = null;

         try {
         FileInputStream fis = new FileInputStream("E:\\workspace\\2010_03\\src\\myPerson.xml");
         myPerson=(Person[])xs.fromXML(fis);
         if (myPerson != null)
         {
             int len = myPerson.length;
             for (int i=0;i<len;i++)
             {
                 System.out.println(myPerson[i].getName());
                 System.out.println(myPerson[i].getAge());
             }

         }
         } catch (FileNotFoundException ex) {
         ex.printStackTrace();
         }
    }
}
运行结果为(console输出),当然可以查看到myPerson.xml文件已经生成:
Inside Person's Constructor
Inside Person's Constructor
<Person-array>
  <Person>
    <name>Jay</name>
    <age>24</age>
  </Person>
  <Person>
    <name>Tom</name>
    <age>23</age>
  </Person>
</Person-array>
Jay
24
Tom
23

 

分享到:
评论

相关推荐

    JAVA对象序列化保存为XML文件的工具类

    【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...

    java对象序列化 传输 保存

    在标签中提到了"源码"和"工具",这可能意味着博客作者还深入分析了Java序列化机制的源代码,并介绍了一些辅助工具,例如`jserialcom`或`serialver`命令,用于查看类的serialVersionUID。 文件列表中的"ser"可能是...

    java 对象的序列化与反序列化

    在Java中,序列化(Serialization)是指将一个对象转换为字节流的过程,这个字节流可以保存到磁盘上,或者通过网络进行传输。要实现一个对象的序列化,该对象的类必须实现`Serializable`接口。这是一个标记接口,...

    介绍Java对象序列化使用基础

    将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象...

    序列化保存对象到Cookie中

    在Web开发中,有时我们需要将对象的信息...以上就是关于“序列化保存对象到Cookie”的详细知识。在实际开发中,合理利用Cookie可以帮助我们实现用户会话管理、个性化设置等功能,但同时也需要注意数据安全和隐私保护。

    Java 文件 序列化 读写

    Java文件序列化是Java平台中一种重要的数据存储和交换机制,它允许我们将对象的状态转换为字节流,以便可以保存到磁盘、网络传输或在内存中存储,然后在需要时将这些字节流恢复为原来的对象。这个过程称为序列化...

    Java序列化

    - Java序列化是Java平台提供的一种持久化机制,它允许将对象转换为字节序列,这样就可以保存在文件中或在网络上传输。 - 序列化不仅可以用来持久化数据,还可以用于进程间通信(IPC)和远程方法调用(RMI)。 2. ...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    java 对象序列化

    1. **持久化存储**:序列化使得对象可以被保存到硬盘上,即使程序关闭,对象状态也能保持。 2. **网络传输**:序列化的对象可以被发送到网络的另一端,用于分布式系统中的对象通信。 3. **缓存**:序列化可以用于...

    java反序列化工具

    在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入安全风险,因为不安全的反序列化可能导致远程代码执行(RCE)漏洞。 在给定的标题和描述中,提到了几个...

    java序列化(Serializable)的作用和反序列化

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    07-Java序列化面试题(10题)-新增.pdf

    Java序列化面试题(10题) 在 Java 中,序列化是一种用于处理对象流的机制,它可以将对象的内容进行流化,使其可以被读写和传输。下面是 10 个与 Java 序列化相关的面试题目: 1. 什么是 Java 序列化,如何实现 ...

    java序列化原理与算法

    Java序列化的核心是将对象转换为字节流,这涉及到一系列复杂的操作步骤。 ##### 序列化算法示例 为了更好地理解序列化的过程,我们可以通过一个简单的例子来进行说明。 ```java import java.io.Serializable; ...

    java程序,序列化和反序列化操作对文件的运用

    序列化是将一个对象转换为字节流的过程,这使得我们可以将对象的状态保存到文件或数据库中,或者在网络上传输。在Java中,要使一个类能够被序列化,我们需要让该类实现`java.io.Serializable`接口。例如: ```java ...

    java序列化和反序列化

    ### Java序列化与反序列化详解 #### 一、Java序列化概述 Java序列化(Serialization)是一项重要的功能,它可以将对象的状态转化为一系列字节,从而实现对象的持久化存储或在网络上传输。序列化机制使得Java对象...

    Java序列化的机制和原理

    Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在后续时间重新创建相同对象的机制。这是Java编程中一个非常重要的概念,尤其是在分布式环境和持久化存储中。让我们深入探讨一下Java...

    Java-使用序列化保存对象数据到文件学习总结

    把字节序列化保存到文件中,就可以做到持久化保存数据内容。 1.2 如何将对象数据序列化保存到文件 使用ObjectOutputStream完成序列化操作: Constructor:  ObjectOutputStream(OutputStream out) Method:  void ...

    Java序列化多次追加到txt以及从txt反序列化

    在这个特定的场景中,我们关注的是如何使用Java序列化来多次追加对象到一个TXT文件,而不是覆盖原有的内容,以及如何从TXT文件中反序列化这些对象并显示在控制台上。 首先,要实现序列化,我们的类必须实现`...

    java基础 对象序列化

    文件序列化是一种常见的序列化应用场景,用于将对象状态保存到文件中。这一过程涉及将对象写入文件,然后在需要时读回内存,恢复其状态。 #### 网络序列化 在网络环境中,对象序列化尤其重要,因为它允许对象跨...

    C++ 对象序列化 保存对象.docx

    3. 存储和恢复:在需要保存对象时,调用序列化方法将对象转换为字节流,然后写入文件;在加载时,从文件读取字节流,再调用反序列化方法恢复对象状态。 C++中实现序列化的一种常见方式是使用`std::ofstream`和`std:...

Global site tag (gtag.js) - Google Analytics