`
月迷津渡
  • 浏览: 101556 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java基础——序列化(Serializable接口,transient关键字)

 
阅读更多

这篇博文主要介绍下Java序列化相关的内容以及如何去理解transient关键字。

首先在Java中有一个序列化接口Serializable,当需要表示该类是可序列化的,我们可以显示的声明实现序列化(Serializable)接口。然而transient关键字正是对于实现了序列化接口的。它的作用是对于标识了transient修饰符不做序列化操作。我们先构建一个类,代码如下:

 

class LoggingInfo implements Serializable {

	//This field is used for check the versions between the original one and deserialized ones.
	private static final long serialVersionUID = 1L;

	private Date loggingDate = new Date();
	private String username;
	private transient String password;

	LoggingInfo(String username, String password) {
		this.username = username;
		this.password = password;
	}

	public String toString() {
		return "username=" + username + " password=" + password;
	}
}

 

 然后我们用方法对上面的实例进行序列化和反序列化。代码如下:

 

public class TestSerial {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
		System.out.println(logInfo.toString());
		FileOutputStream fos = new FileOutputStream("c:\\logging.obj");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(logInfo);
		oos.close();
	}
}

 

代码执行完后我们会发现在c盘根目录多出一个名为logging.obj的文件。说明序列化成功。同时最重要的是在序列化之前控制台上会打出password为'MECHANICS'的字样。这说明在序列化前这个对象的password是有值的。

 

于是我们再对其进行反序列化。代码如下:

 

public class TestSerial {
	public static void main(String[] args) throws IOException, ClassNotFoundException {

		FileInputStream fis = new FileInputStream("c:\\logging.obj");
		ObjectInputStream ois = new ObjectInputStream(fis);
		LoggingInfo info = (LoggingInfo) ois.readObject();
		ois.close();
		System.out.println(info);

	}

}

 

 再运行了此段代码后你会发现password值变成了null,也就说明了transient值起作用了。

 

最后还有一点需要强调,就是serialVersionUID。该域是控制版本使用的。对于同一个对象,如果该域的原始值和

反序列化之后的值不一致。则认为这2个同一类型的对象,是序列化不兼容的。如果我们默认不显式设置该值,那么该值会在编译时期进行添加。也就是说一旦当你第一次序列化成功后,如果原对象进行再编译,那么序列化对象是无法成功反序列化的。 因为两次对该对象的编译产生的serialVersionUID是不同的。所以我们一般比较通用的做法是将该域的值显式进行

赋值,这样就能对序列化和反序列化做兼容了。

 

当然并不serialVersionUID相同就一定能够成功的进行序列化操作。前提是同一个对象的序列化和反序列化对象在

内容上保持一致。如果对某对象添加了某个新的方法等等改变原有对象行为的操作,哪怕serialVersionUID相等也只有在

少数情况下,能够对序列化进行兼容。

 

 

 

分享到:
评论

相关推荐

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字)

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字) Java序列化和反序列化是Java虚拟机中的一种重要机制,它们可以将Java对象转换为二进制数据,然后...

    Java_transient关键字

    在Java编程语言中,`transient`关键字是一个非常重要的概念,主要用于对象序列化过程中对特定变量的控制。当一个类实现了`Serializable`接口时,其对象可以被序列化为一个持久化的存储形式,以便在网络上传输或存储...

    Java之transient关键字.Java

    在Java编程语言中,`transient`关键字是一个非常重要的特性,它用于标记对象的某个成员变量不应该被序列化。当你创建一个可序列化的类(通过实现`Serializable`接口)时,如果你不想某些字段在序列化过程中被保存或...

    Java transient关键字使用小记

    在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...

    java serializable 序列化与反序列化

    `Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,它的实例就可以被序列化。 **一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换...

    序列化 serializable demo

    首先,`Serializable`接口是Java中用于实现序列化的标志接口。它没有定义任何方法,但当一个类实现了这个接口,Java的ObjectOutputStream就可以将该类的对象写入到流中。例如,`MySerializable.java`和`Product.java...

    Java transient关键字与序列化操作实例详解

    Java transient关键字与序列化操作实例详解 Java语言中的transient关键字是用来修饰变量的,表明该变量不会被Java虚拟机(JVM)序列化,即不会被写入到二进制流中。序列化是Java语言中的一种机制,用于将对象转换为...

    Java关键字Transient与串行化

    在Java编程语言中,`transient`关键字与对象的序列化(serialization)机制密切相关,它在处理对象状态的持久化时扮演着关键角色。本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ...

    深入探索Java对象的序列化

    深入探索Java对象的序列化 对象序列化就是把对象写入到输出流中,用来存储或者传输。...实现了序列化接口的类,如果其成员不需要序列化进去,则使用transient关键字进行修饰。 下面给出个例子:

    java 对象的序列化与反序列化

    4. **非序列化字段**:有些字段可能不希望被序列化,可以使用`transient`关键字标记。这些字段在序列化过程中会被忽略。 5. **深拷贝与浅拷贝**:序列化实际上是实现了深拷贝,即创建了对象的一个完全独立的副本,...

    java 对象默认序列化的干预方法

    在Java中,实现`Serializable`接口的类可以被序列化。然而,有时我们可能希望在序列化过程中忽略某些敏感或临时的成员变量。这就是`transient`关键字的用途。 `transient`关键字用于标记某个成员变量,使其在序列化...

    可序列化接口Serializable

    2. **transient关键字**:如果你想排除某个字段不参与序列化,可以将其声明为`transient`。 ```java public class MyClass implements Serializable { private int id; private transient String password; // ...

    Java transient关键字原理解析

    Java 中的 transient 关键字是一个重要的概念,它被用来表示变量将不被序列化处理。那么在理解 transient 关键字之前,我们先了解下什么是序列化。 序列化是对象进行持久化处理,也就是说,将对象转化成一个字节流...

    java.io.Serializable序列化问题

    序列化的核心接口是 `java.io.Serializable`,它是一个标记接口,没有定义任何方法,用于标记可以被序列化的类。 #### 二、实现序列化的方法 为了使一个类支持序列化,需要让该类实现 `Serializable` 接口。实现这...

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

    3. **序列化过滤**:使用`transient`关键字忽略不想序列化的字段,或使用`@serialData`注解指定序列化时的行为。 4. **实现Serializable并提供serialVersionUID**:确保类的序列化兼容性,避免因类结构变化导致的反...

    java关键字transient

    在Java编程语言中,`transient`是一个非常重要的关键字,它与对象持久化和序列化密切相关。当一个字段被声明为`transient`时,它表明该字段的值不会随着对象的序列化而保存。这通常用于那些不希望或者不需要在序列化...

    java对象序列化.ppt

    通过实现`Serializable`或`Externalizable`接口,我们可以控制对象如何被序列化和反序列化,同时`transient`关键字提供了保护敏感数据的手段。理解和熟练运用这些概念对于Java开发者来说非常重要,特别是在处理持久...

Global site tag (gtag.js) - Google Analytics