• 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
    
    

    回到目录|·(工)·)

  • 相关阅读:
    Get-CrmSetting返回Unable to connect to the remote server的解决办法
    Dynamics 365中的常用Associate和Disassociate消息汇总
    Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
    Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法
    Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录
    注意,更改团队所属业务部门用Update消息无效!
    Dynamics 365的审核日志分区删除超时报错怎么办?
    Dynamics 365使用Execute Multiple Request删除系统作业实体记录
    Dynamics 365的系统作业实体记录增长太快怎么回事?
    Dynamics CRM日期字段查询使用时分秒的方法
  • 原文地址:https://www.cnblogs.com/MyStringIsNotNull/p/8018029.html
Copyright © 2020-2023  润新知