0

0

对象的序列化

巴扎黑

巴扎黑

发布时间:2016-12-02 10:01:41

|

1511人浏览过

|

来源于php中文网

原创

对象的序列化 
序列化就是保存对象中的状态(即类中的属性),就是将对象的实例变量和引用变量存储成为磁盘中的一个文件,以便以后重新使用该对象的时候不用再重新创建。而解序列化就是恢复对象的状态,读取磁盘中的序列化文件,将每项状态赋值给对象,并被新的引用变量引用。 
在对象被序列化时,该对象所引用的实例变量都会被序列化。 
当然我们也能把一个类序列化,方法就是将该类实现serialization接口,这个接口没有需要实现的方法,只是用来告诉虚拟机实现这个接口的类都可以被序列化。 
如果在被序列化的类中有未实现序列化的类的实例对象,有点拗口;换个说法,就是在类dog中有类student的实例变量,类dog实现了serialization接口,而student类没有实现,这时候如果将类dog序列化,执行期会抛出异常。这时我们就需要transient(瞬时)来标记住不需要和不应该序列化的变量,使用transient需要先import java.net.*。在还原的时候被transient的引用变量值会变为null,primitive主数据类型变量会被还原成默认值。 
静态变量是不可被序列化的,因为静态变量是在类上面的变量。 
记得用jdk里面的serialver工具来查询类的seriaversionuid(版本id)。 
再还原对象时会比对该对象的类的版本id如果不对就会还原失败,一般这个值都被标记为final static 存在类中。 
序列化的流程如下: 
⑴先创建出fileoutputstring对象,该对象用来存取生成的文件。 
fileoutputstream  fs=new fileoutputstream(“test.ser”); 
test.ser就是生成的文件名,在字符串中你可以定义要输出的文件的路径。例如d:\javaserialization\test.ser 
好像必须要双反斜杠,不然会报错。 
⑵创建objectoutputstream对象,将你所需要序列化的对象写入fileoutputstring对象fs。 
objectoutputstream  oos=new objectoutputstream  (fs); 
传入fs。 
⑶将对象的引用变量名写入objectoutputstream对象的writerobject方法中。 
oos.writerobjec(test); 
test就是被序列化的对象的引用变量名。 
即object test=new object(); 
⑷最后不要玩了关闭objectoutputstream。
oos.close(); 

以上就是对象的序列化 

下面来说对象的解序列化 
当我们需要用到被序列化的对象时,我们就要将该对象解序列化,好像是废话。 
对象的解序列化也是四步: 
⑴连接对象序列化文件 
fileinputstrieam  fip=new fileinputstrieam(“test.ser”); 
注意如果不在当前目录下要加上文件的路径,如果虚拟机找不到这个文件就会抛出异常。 
⑵创建objectinputstream对象来读取序列化文件 
objectinputstream  ois=new objectinputstream  (fip); 
⑶通过readobject方法返回一个object类型的对象。还需要将object对象的类型转换回原来的类型。 
object new=ois.readobject(); 
注意在序列化文件中可能会存有不止一个的对象的序列化文本,他会按照文本的顺序来读取文本数据。 
每次调用readobject方法都会读出下一个对象。 
⑷最后关闭objectinputstream 
ois.close(); 

ShopWind网店系统
ShopWind网店系统

ShopWind网店系统是国内最专业的网店程序之一,采用ASP语言设计开发,速度快、性能好、安全性高。ShopWind网店购物系统提供性化的后台管理界面,标准的网上商店管理模式和强大的网店软件后台管理功能。ShopWind网店系统提供了灵活强大的模板机制,内置多套免费精美模板,同时可在后台任意更换,让您即刻快速建立不同的网店外观。同时您可以对网模板自定义设计,建立个性化网店形象。ShopWind网

下载
package com.xuliehuaTest;  
//需要先引用Java中的io包,才能实现Serializable接口。  
import java.io.*;  
import java.util.ArrayList;  
  
import javax.print.attribute.standard.Sides;  
//先建立一个可供序列化的类DogTest。  
//然后在main方法中队类DogTest的对象进行序列化。  
public class DogTest implements Serializable{  
    private int size;  
    private String name;  
      
    public void setSize(int size){  
    this.size=size;  
    }  
    public void setName(String na){  
        name=na;  
    }  
    public int getSize(){  
        return size;  
    }  
    public String getName(){  
        return name;  
    }  
    public static void main(String[]args){  
        DogTest dt=new DogTest();  
        DogTest dt1=new DogTest();  
        DogTest dt2=new DogTest();  
        ArrayList arraylist=new ArrayList();  
        arraylist.add(dt);  
        arraylist.add(dt1);  
        arraylist.add(dt2);  
        dt.setSize(12);  
        dt.setName("xiao bao");  
        dt1.setSize(25);  
        dt1.setName("tu qiang");  
        dt2.setSize(31);  
        dt2.setName("da gei gou");  
        try{  
            int x=0;  
            FileOutputStream f=new FileOutputStream("C:\\daxue.ser");  
            ObjectOutputStream oo=new ObjectOutputStream(f);  
            while(x<3){  
                          //将对象被序列化前的状态打印  
                System.out.println(x);  
                System.out.println("Size="+arraylist.get(x).getSize()+" ");  
                System.out.println("name="+arraylist.get(x).getName());  
                System.out.println(arraylist.get(x));  
  
                oo.writeObject(arraylist.get(x));  
                x=x+1;  
                  
            }  
            oo.close();  
        }catch(Exception ex){  
            ex.printStackTrace();  
        }  
    }  
}
package com.xuliehuaTest;  
import java.io.*;  
import java.util.ArrayList;  
public class JieXuLieHua {  
    static ArrayList arraylist=new ArrayList();  
    public static void main(String[] args){  
        try{  
              
            FileInputStream fdi=new FileInputStream("C:\\liheng.ser");  
            ObjectInputStream oi=new ObjectInputStream(fdi);  
            Object o1=oi.readObject();  
            Object o2=oi.readObject();  
            Object o3=oi.readObject();  
            arraylist.add(o1);    
            arraylist.add(o2);  
            arraylist.add(o3);    
            int x=0;  
            while(x<3){  
                               //将解序列化的对象状态进行打印  
                System.out.println(x);  
                System.out.println((DogTest)arraylist.get(x));  
                System.out.println("name = "+((DogTest)arraylist.get(x)).getName());  
                System.out.println("size = "+((DogTest)arraylist.get(x)).getSize());  
                x=x+1;  
            }  
              
            oi.close();  
          
              
              
              
            }catch(Exception ex){  
            ex.printStackTrace();  
        }  
          
    }					
					

					

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号