`
regedit_123
  • 浏览: 317951 次
  • 性别: 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.beans包中,有两个好东西,XMLEncoder和XMLDecoder。从XML存取对象真是太费力气啦。做了小工具类,以后可以用用了。本文介绍了这两个可以把JAVA对象序列化保存为XML文件的工具类。

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

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

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

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

    Java对象的序列化和反序列化实践

    当两个进程在进行远程通信时,彼此可以发送...  1)把对象的字节序列地保存到硬盘上,通常存放在一个文件中;  2)在网络上传送对象的字节序列。  一、JDK类库中的序列化API  java.io.ObjectOutputStream代表

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    Java高级程序设计 第5章 Java序列化机制 5.1 应用场景 5.2 相关知识5.3 实施过程 5.4 拓展知识5.5 拓展训练 5.6 课后小结5.7 课后习题 5.8 上机实训 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前...

    java面向对象课程设计——学生管理系统——附源码+word文档

    (1)学生数据按对象序列化写入student.dat文件 (2)程序启动后,从student.dat文件读取学生对象存入ArrayList中; (3)增加学生数据时将学生对象Student存入ArrayList,按保存后再写入student.dat; (4)删除学生必须...

    Java序列化

    把字节序列化保存到文件中,就可以做到持久化==保存数据内容。 从文件中读取字节序列化数据,可以直接得到对应的对象。 1.2 ObjectOutputStream类 将对象数据序列化,保存到文件中 构造方法 Constructor ...

    WEBSphere反序列化漏扫.rar

    Java 序列化是指把 Java 对象转换为字节序列的过程,便于保存在内存、文件、数据库中,ObjectOutputStream类的 writeObject() 方法可以实现序列化。反序列化是指把字节序列恢复为 Java 对象的过程,...

    序列化

    把字节序列化保存到文件中,就可以做到持久化保存数据内容。 从文件中读取字节序列化数据,可以直接得到对应的对象。 2 ObjectOutputStream类 将对象数据序列化,保存到文件中 构造方法 Constructor ...

    对象的序列化和反序列化1

    1、序列化是干什么的 2、什么情况下需要序列化 3、当对一个对象实现序列化时,究竟发生了什么 4、实现序列化(保存到一个文件)的步骤 5、举例说明 6、相关注意

    java源码包---java 源码 大量 实例

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    基于Java实现学生选课模拟系统之文件输入输出【100011979】

    采用对象序列化的 readObject 方法从文件中恢复对象,并操作学生的选课课表,实现退课操作。 3.打印课程对象信息,采用覆盖定义 toString()方法的方式。 实验步骤 在保持实验三项目中,Course 类,Student 类,...

    Android中的序列化浅析

    1.永久性保存对象,保存对象的字节序列到本地文件中; 2.对象在网络中传递; 3.对象在IPC间传递。 序列化方法 在Android系统中关于序列化的方法一般有两种,分别是实现Serializable接口和Parcelable接口,其中...

    JAVA上百实例源码以及开源项目

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中调用函数  17.2 设定查询条件  17.2.1 比较运算  17.2.2 范围运算  17.2.3 字符串模式匹配  17.2.4 逻辑运算  17.2.5 集合运算  17.3 小结...

    java源码包2

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java源码包4

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java源码包3

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    Android 序列化的存储和读取总结及简单使用

    永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中  (2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式) ...

Global site tag (gtag.js) - Google Analytics