Externalizable和Serializable

Externalizable继承于Serializable
Externalizable序列化时会调用默认构造器
Serializable序列化时不会调用默认构造器

Externalizable可以通过writeObject指定序列化哪个属性默认是不序列化,被transient修饰的属性也将被序列化

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
 
//Externalizable接口的使用
public class ExternalizableTest implements Externalizable {
 
    private transient String content = "是的,我将会被序列化,不管我是否被transient关键字修饰";
 
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(content);
    }
 
    @Override
    public void readExternal(ObjectInput in) throws IOException,
            ClassNotFoundException {
        content = (String) in.readObject();
    }
 
    public static void main(String[] args) throws Exception {
        
        ExternalizableTest et = new ExternalizableTest();
        ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
                new File("test")));
        out.writeObject(et);
 
        ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
                "test")));
        et = (ExternalizableTest) in.readObject();
        System.out.println(et.content);
 
        out.close();
        in.close();
    }
}
Serializable序列化除了static和transient修饰的属性,也可以全部加上transient通过writeObject指定序列化属性被指定的属性无视transient修饰

transient:

1,变量一但被transient修饰,变量将不再是对象序列化的一部分,该变量将不被序列化,反序列化后也无法访问

2,transient只能用于修饰变量,而不能修饰方法和类,本地变量无法被修饰,变量如果是用户自定义的则该类需要基础Serializable接口

3,静态变量被transient修饰和不被修饰都无法序列化

由于类中的属性加上static关键字后,程序运行结果依然不变,所以反序列化后带有static关键字的属性的值是从JVM中获取的

 

实现了Externalizable或Serializable接口的类

可以通过objectOutputStrem进行序列化:利用fileoutputstrem可以将对象持久化在本地,也可以输出到另一台机子上

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
// 使用transient关键字不序列化某个变量 注意读取的时候,读取数据的顺序一定要和存放数据的顺序保持一致
public class TransientTest {
    
    public static void main(String[] args) {
        
        User user = new User();
        user.setUsername("Alexia");
        user.setPasswd("123456");
        
        System.out.println("read before Serializable: ");
        System.out.println("username: " + user.getUsername());
        System.err.println("password: " + user.getPasswd());
        
        try {
            ObjectOutputStream os = new ObjectOutputStream(
                    new FileOutputStream("C:/user.txt"));
            os.writeObject(user); // 将User对象写进文件
            os.flush();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            ObjectInputStream is = new ObjectInputStream(new FileInputStream(
                    "C:/user.txt"));
            user = (User) is.readObject(); // 从流中读取User的数据
            is.close();
            
            System.out.println("\nread after Serializable: ");
            System.out.println("username: " + user.getUsername());
            System.err.println("password: " + user.getPasswd());
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
 
class User implements Serializable {
    private static final long serialVersionUID = 1L;  
    
    private String username;
    private transient 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;
    }
 
}

利用byteArrayOutputStrem可以将对象序列化到内存中,也可以输出到另外一台机子上

import java.io.*;
import java.util.*;

public class SerialCtl implements Serializable{
        String a;
        transient String b;
        public SerialCtl(String aa, String bb){
                a="Not Transient:"+aa;
                b="Transient:"+bb;
        }
        public String toString(){
                return a+"\n"+b;
        }

        private void writeObject(ObjectOutputStream o)throws IOException{
                o.defaultWriteObject();
        //      o.writeObject(b);
        }
        private void readObject(ObjectInputStream streamr)throws IOException, ClassNotFoundException{
                streamr.defaultReadObject();
        //      b=(String)streamr.readObject();
        }

        public static void main(String[] args){
                SerialCtl sc =
                        new SerialCtl("Test1","Test2");
                System.out.println("Before:\n"+sc);
                ByteArrayOutputStream buf =
                        new ByteArrayOutputStream();
                try{
                        ObjectOutputStream out1 = new
                                ObjectOutputStream(buf);

                        out1.writeObject(sc);

                        ObjectInputStream in1 = new
                                ObjectInputStream(new
                                        ByteArrayInputStream(buf.toByteArray()));

                        SerialCtl sc2 = (SerialCtl)in1.readObject();
                        System.out.println("After:\n"+sc2);

                }catch(ClassNotFoundException e){
                        e.printStackTrace();
                }catch(IOException e){
                        e.printStackTrace();

                }
        }
}

 

ps:用于学习记录,本人小白一个,如果有误,希望大佬多多指点,谢谢^_^

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值