`
rock2007
  • 浏览: 508 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

java序列化java.io.Externalizable

阅读更多
这次我们讲的是控制对象的序列化和反序列化


控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据



我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable



Externalizable 接口定义了两个方法,
writeExternal方法在序列化时被调用,可以在该方法中控制序列化内容,
readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容



好了,现在我们改写上例的UserInfo

Java代码
import java.io.*;  
import java.util.*;  
 
//本程序通过实现Externalizable接口控制对象序列化和反序列  
public class UserInfo implements Externalizable {  
    public String userName;  
    public String userPass;  
    public int userAge;  
 
    public UserInfo(){  
    }  
 
    public UserInfo(String username,String userpass,int userage){  
        this.userName=username;  
        this.userPass=userpass;  
        this.userAge=userage;  
    }  
      
    //当序列化对象时,该方法自动调用  
    public void writeExternal(ObjectOutput out) throws IOException{  
        System.out.println("现在执行序列化方法");  
        //可以在序列化时写非自身的变量  
        Date d=new Date();  
        out.writeObject(d);  
        //只序列化userName,userPass变量  
        out.writeObject(userName);  
        out.writeObject(userPass);  
    }  
 
    //当反序列化对象时,该方法自动调用  
    public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{  
        System.out.println("现在执行反序列化方法");  
        Date d=(Date)in.readObject();  
        System.out.println(d);  
        this.userName=(String)in.readObject();  
        this.userPass=(String)in.readObject();  
    }  
 
    public String toString(){  
        return "用户名: "+this.userName+";密码:"+this.userPass+  
            ";年龄:"+this.userAge;  
    }  



 
改写测试类

Java代码
import java.io.ObjectOutputStream;  
import java.io.ObjectInputStream;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.util.Date;  
import java.lang.management.*;  
public class Test {  
 
    //序列化对象到文件  
    public static void serialize(String fileName){  
        try 
        {  
            //创建一个对象输出流,讲对象输出到文件  
            ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));  
 
            UserInfo user=new UserInfo("renyanwei","888888",20);  
            out.writeObject(user);  //序列化一个会员对象  
 
            out.close();  
        }  
        catch (Exception x)  
        {  
            System.out.println(x.toString());  
        }  
          
    }  
    //从文件反序列化到对象  
    public static void deserialize(String fileName){  
        try 
        {  
            //创建一个对象输入流,从文件读取对象  
            ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));  
 
            //读取UserInfo对象并调用它的toString()方法  
            UserInfo user=(UserInfo)(in.readObject());            
            System.out.println(user.toString());  
 
            in.close();  
        }  
        catch (Exception x)  
        {  
            System.out.println(x.toString());  
        }  
          
    }  
 
    public static void main(String[] args) {      
 
        serialize("D:\\test.txt");  
        System.out.println("序列化完毕");  
          
        deserialize("D:\\test.txt");  
        System.out.println("反序列化完毕");  
    }  
 



  执行结果

现在执行序列化方法
序列化完毕
现在执行反序列化方法
Thu Oct 23 22:18:12 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕

总结:
首先,我们在序列化UserInfo对象的时候,由于这个类实现了Externalizable 接口,在writeExternal()方法里定义了哪些属性可以序列化,哪些不可以序列化,所以,对象在经过这里就把规定能被序列化的序列化保存文件,不能序列化的不处理,然后在反序列的时候自动调用readExternal()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列
分享到:
评论

相关推荐

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

    其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...

    JAVA序列化Serializable及Externalizable区别详解

    主要介绍了JAVA序列化Serializable及Externalizable区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java 对象序列化详解以及实例实现和源码下载

    Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...

    Java中的序列化与反序列化.pdf

    Serializable接口和Externalizable接口实现序列化和反序列化

    java序列化和反序列化,面试必备

    最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...

    深入探索Java对象的序列化

    Serializable有一个子接口Externalizable,实现Externalizable接口的类可以自行控制对象序列化荷反序列化过程。 一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果...

    Java 串行化(序列化)Serializable/Externalizable

    NULL 博文链接:https://zhycaf.iteye.com/blog/982092

    xml的序列化与验证

    1、xml序列化的Java3种实现方法 1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator ...

    JDK_API_1_6

    Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。 类摘要 BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 ...

    groovy-io:与JSON格式之间完美的Groovy序列化。 此外,还支持JSON的精美打印(与jsonEditorOnline样式匹配)

    groovy-io消除了使用ObjectInputStream / ObjectOutputStream序列化对象的需要,而使用了JSON格式。 有第三个可选类( JsonObject ),请参见下面的“非类型化用法”。 groovy-io不需要类实现Serializable或...

    LargeCollections

    虽然 LargeCollections 支持任何 Serializable/Externalizable/Writable/Kryo-Serializable Key 和 Value 类,但底层实现将所有内容存储为字节数组键值存储(类似于 HBase)。 因此,每个键/值实例都需要转换为

    j2ee中英文对照版api

    public void setCommandContext(String verb, DataHandler dh) throws java.io.IOException 用请求处理的动词和描述将要操作的数据的 DataHandler 来初始化 Command。注:调用者为 DataHandler 传递 null 值是可以...

    VALJOGen:VALue Java 对象生成器 (VALJOGen)

    VALJOGen 可用于从带注释的 Java 接口生成现代 Java 7/8+ 值类。 特征: 可以从您的接口使用自动实现的 getter 和 setter生成值对象。 支持自动实现工厂方法、构造函数、对象。 哈希码,对象。 等于,对象。 ...

    dom4J的使用方法ppt.

    dom4J的使用方法ppt.

    cocoaAMF使用指南.zip

    You can encode keyed and non-keyed, where the latter means you're encoding an externalizable class. While deserializing, if no class with the classname of the received object is found, CocoaAMF ...

Global site tag (gtag.js) - Google Analytics