zoukankan      html  css  js  c++  java
  • K:java序列化与反序列化—transient关键字的使用

      首先,应该明白的是transient是java中的一个关键字,音标为 英: [ˈtrænziənt]

      在了解transient关键字之前,应该先弄明白序列化和反序列化。所谓的序列化,通俗点的来说,就是将一个对象转化为字节序列的形式来表示,这些字节序列中包含了一个对象的相关属性信息。一个对象进行序列化之后,可以被存储到硬盘当中,也可以用于网络传输。而反序列化便是将一个对象的字节序列转化为原先的java对象,这个过程便是反序列化。

      在java中,transient关键字的作用是让被该transient关键字所修饰的成员属性不被序列化。

    示例代码如下:

    package other.serial;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    /**
     * 该类的代码用于演示transient关键字的使用
     * @author 学徒
     *
     */
    public class Person implements Serializable
    {
    	private String name="张红";
    	private String sex="女";
    	//女人的年龄是秘密,不能被外面的人知道
    	private transient int age=10;
    	//重载Object类的toString方法
    	@Override
    	public String toString()
    	{
    		return "姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age;
    	}
    	public static void main(String[] args)throws Exception
    	{
    		String path="H:\xiaohonghong.obj";
    		//输出对象的信息并进行序列化操作
    		Person xiaohong=new Person();
    		System.out.println(xiaohong);
    		File output=new File(path);
    		FileOutputStream out=new FileOutputStream(output);
    		ObjectOutputStream outputObject=new ObjectOutputStream(out);
    		outputObject.writeObject(xiaohong);
    		
    		//进行反序列化操作并输出对象信息
    		File input=new File(path);
    		FileInputStream in=new FileInputStream(input);
    		ObjectInputStream inputObject=new ObjectInputStream(in);
    		xiaohong=(Person)inputObject.readObject();
    		System.out.println(xiaohong);
    	}
    	
    }
    
    
    运行结果:
    姓名:张红  性别:女  年龄:10
    姓名:张红  性别:女  年龄:0
    

    至于为什么要不被序列化,其主要是为了节省存储空间,以及为了保证程序的整体逻辑

    需要注意的是:

    1. transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量(即局部变量)是不能被transient关键字修饰的。
    2. 被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

    还有一点需要值得注意的是,在实现了Serializable接口的时候,其序列化过程是默认自动进行的,为此,被transient修饰符所修饰的成员变量不被序列化。而当使用Externalizable接口实现序列化操作的时候,其序列化过程是程序编写人员进行控制的,没有任何东西会进行自动的序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。

    实例代码如下:

    package other.serial;
    
    import java.io.Externalizable;
    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;
    
    /**
     * 该类的代码用于演示transient关键字的使用
     * @author 学徒
     *
     */
    public class Person implements Externalizable
    {
    	private String name="张红";
    	private String sex="女";
    	//女人的年龄是秘密,不能被外面的人知道
    	private transient int age=10;
    	//重载Object类的toString方法
    	@Override
    	public String toString()
    	{
    		return "姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age;
    	}
    	public static void main(String[] args)throws Exception
    	{
    		String path="H:\xiaohonghong.obj";
    		//输出对象的信息并进行序列化操作
    		Person xiaohong=new Person();
    		System.out.println(xiaohong);
    		File output=new File(path);
    		FileOutputStream out=new FileOutputStream(output);
    		ObjectOutputStream outputObject=new ObjectOutputStream(out);
    		outputObject.writeObject(xiaohong);
    		
    		//进行反序列化操作并输出对象信息
    		File input=new File(path);
    		FileInputStream in=new FileInputStream(input);
    		ObjectInputStream inputObject=new ObjectInputStream(in);
    		xiaohong=(Person)inputObject.readObject();
    		System.out.println(xiaohong);
    	}
    	/**
    	 * 控制需要进行序列化的成员变量
    	 */
    	@Override
    	public void writeExternal(ObjectOutput out) throws IOException
    	{
    		out.writeObject(name);
    		out.writeObject(sex);
    		//女人的年龄虽然是个秘密,但是序列化我是个大嘴巴,我要告诉别人
    		out.writeInt(age);
    	}
    	/**
    	 * 控制进行反序列化的成员变量
    	 */
    	@Override
    	public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException
    	{
    		this.name=(String)in.readObject();
    		this.sex=(String)in.readObject();
    		//这样我就知道女人的年龄了
    		this.age=in.readInt();
    	}
    	
    }
    
    
    运行结果:
    姓名:张红  性别:女  年龄:10
    姓名:张红  性别:女  年龄:10
    
    

    回到目录|·(工)·)

  • 相关阅读:
    MySQL百万级数据量分页查询方法及其优化
    聊一聊二维码扫描登录原理
    在吗?认识一下JWT(JSON Web Token) ?
    怎样和领导汇报工作,更容易获得升职加薪?谈谈和领导汇报的艺术
    javascript sleep pause 实现
    google 根据地址得ip 并显示
    javascript 闭包
    javascript 对象 telecom
    javascript 对象
    google maker 标注
  • 原文地址:https://www.cnblogs.com/MyStringIsNotNull/p/8018029.html
Copyright © 2011-2022 走看看