`
qdpurple
  • 浏览: 276749 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Serializable 序列化问题学习

阅读更多

声明:  关于序列化/反序列化 这有一篇javaeye中很全面的解释: 浏览.  本文主要记录我对平台中的序列化/反序列化的理解学习. 由于个人文采有限, 表达,组织不合适, 及粘贴代码不完整, 望见谅

 

在平台中在自定义异常类中,看到有 private static final long serialVersionUID = -7564015249480613950L;

这行代码, 有几个疑问:

1. 这行代码作用是什么? 不加有怎样?

网上搜了一下大体知道,这是个序列化和返序列化版本版本控制的标志.对于所用实现java.lang.Serializable接口的类都建议使用.(关于序列化和反序列化见 3 )

测试1: 不添加序列化

 

	//private static final long serialVersionUID = 5159342088681301L;

 使用jdk1.5 编译,序列化产生对象文件.

使用jdk1.6 反序列获得对象,可以获得对象的属性.

?问题1  并没有报错,说版本不同? =>已解决

:是我对此理解还有问题? 

http://www.blogjava.net/invisibletank/archive/2007/11/15/160684.html

中看到原来版本控制是说,当

"如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。 "

测试2: 

先序列化一个对象, 然后在类中增加一个成员变量 short shortVar = 0;

然后调用反序列化方法, 结果:

 

java.io.InvalidClassException: com.bryant.test.SerialTest; local class incompatible: stream classdesc serialVersionUID = 659456840250255615, local class serialVersionUID = -7474528909570989615
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:546)

 符合预测,即没有写serialVersionUID时,版本不同报错.

测试3 : 添加版本控制,

先序列化对象, 然后删除一个成员变量 short shortVar = 0; 进行反序列化,

运行正常.

至此问题1解决.

总结: 在一个可以序列化类中,加入serialVersionUID可以保持版本兼容:(避免 当序列化一个对象后,然后增减类成员变量,再进行反序列化时 程序出异常)

 

2. 这个代码变量的值是怎么获得的? 

在eclipse中当类实现Serrial接口时,eclipse会在类所在行叹号提示,

 

"The serializable class SerialTest does not declare a static final serialVersionUID field of type 

 long ", ctrl + 1 : 点击"add default serial version Id" ,自动生成 

 

	private static final long serialVersionUID = 1L;

 点击"add generated serial version Id " ,生成

 

 

private static final long serialVersionUID = 8515159342088681301L;

解决.

 

 问题2 ,default和 generated Id 区别?

 

3. 序列化/反序列化

序列化: 把java对象生成一个文件(这些文件包含对象的所有信息)

反序列化: 把序列化生成的文件 转化成java对象

 

怎么序列化/反序列化一个对象?

3.1 序列化步骤

创建文件对象(所有序列化对象生成的文件) ->封装成Inputstream流 -> 封装成ObjectOutputStream对象oos

通过调用oos的writeObject()方法,输出序列化对象.

 

 

	public static void serialObj(Object obj) throws IOException{
		File file = new File("c:\\", obj.toString() );
		ObjectOutputStream oos = null;
		try {
			oos = new ObjectOutputStream(new FileOutputStream(file));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw e;
		}	//create output stream
		
		try {
			oos.writeObject(obj);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			logger.error("servial error!");
			e.printStackTrace();
		}finally{
			oos.close();	
		}
		logger.info("servial ok!");
		
	}

 3.2 反序列化步骤

创建文件对象 --> 封装成inputstream流 --> 封装成ObjectinputStream流对象ois

调用ois的readObject() 方法返回对象,

强制类型转换成已知类型的对象.

 

 

	public void getSerivalObj() throws FileNotFoundException, IOException, ClassNotFoundException{
		PropertyConfigurator.configure("D:/workspace/common_jars/log4j.properties");
		File file = new File("c:\\", String.valueOf( "com.bryant.test.SerialTest@1270b73" ) );
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
		Object obj = ois.readObject();
		logger.info( ((SerialTest)obj).intTest + ((SerialTest)obj).s );
		
		
	}	
分享到:
评论

相关推荐

    java serializable 序列化与反序列化

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

    java.io.Serializable序列化问题

    ### Java.io.Serializable 序列化问题详解 #### 一、序列化的概念与作用 在 Java 编程语言中,序列化是一种将对象的状态(即成员变量的值)转换为可以存储或传输的形式的过程。通常,这种形式是字节流,但也可以是...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    java序列化(Serializable)的作用和反序列化

    序列化和反序列化是Java中非常重要的概念,它们提供了强大的工具来处理对象的状态保存和恢复问题。通过上述介绍和示例代码,我们可以看到序列化的基本过程及其应用场景。掌握这些知识对于开发高效可靠的Java应用程序...

    析Android中的Serializable序列化.rar_Serializable _android

    Android中的Serializable序列化是开发者常用的数据处理工具,理解其工作原理和应用场景有助于优化代码并避免潜在的问题。然而,在实际开发中,我们还需要根据具体需求和性能考虑,选择最合适的序列化策略。

    Serializable序列化

    **Serializable序列化** 在Java编程语言中,`Serializable`接口是一个非常重要的概念,它涉及到对象的状态持久化和网络传输。序列化是将一个对象转换为字节流的过程,这样就可以将其保存到磁盘、数据库或者在网络中...

    Java_Serializable(序列化)的理解和总结

    ### Java Serializable(序列化)的理解和总结 #### 一、序列化的定义与目的 序列化是一种将对象的状态转换为可以存储或传输的形式的过程。在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被...

    序列化 serializable demo

    另外,序列化还涉及到版本控制问题,如果类的结构(如字段、方法等)发生变化,可以使用`serialVersionUID`来指定序列化版本。默认情况下,JVM会根据类的结构自动生成一个版本号,但如果手动定义`serialVersionUID`...

    Android序列化——Serializable与Parcelable

    本文将深入探讨两种主要的序列化方式:Serializable和Parcelable,并比较它们的优缺点以及适用场景。 首先,我们来了解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Android中,这个...

    hessian学习基础篇——序列化和反序列化

    在Java中,如果一个类实现了Serializable接口,那么该类的对象就可以被序列化。序列化的目的是为了保存对象的状态以便后续使用或在网络上传输。 Hessian,由Caucho Technology开发,是一种二进制的序列化格式。相比...

    javascript实现序列化serializable unserializable

    在这种情况下,JSONP和CORS等技术可以用来解决这些问题,但它们并不涉及直接的序列化和反序列化操作,而是处理数据传输和安全问题。 此外,有一些第三方库,如`msgpack.js`或`bson`,提供了更高效的序列化和反序列...

    可序列化接口Serializable

    序列化可能引发安全问题,因为任意对象的序列化可能会暴露敏感信息。因此,在序列化和反序列化过程中应谨慎处理,避免反序列化不受信任的数据。 **自定义序列化和反序列化** 如果默认的序列化方式不能满足需求,...

    java序列化和反序列化的方法

    java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,...开发者需要根据具体的需求和场景选择合适的序列化和反序列化方法,并注意序列化和反序列化过程中的问题。

    序列化类的作用Serializable

    如果某个类的父类没有实现`Serializable`接口,那么子类仍然可以序列化,但是父类的字段不会被序列化,除非父类中声明了`transient`或`volatile`的字段。 在序列化过程中,有时需要对特定类的字段进行特殊处理。...

    C#序列化学习的源码

    开发者可以通过实现`ISerializable`接口来自定义序列化行为,或者使用`[Serializable]`和`[NonSerialized]`特性来控制哪些字段参与序列化。源码可能包含如何自定义序列化逻辑的示例。 7. **数据合同与数据成员** ...

    Serializable在C#中的作用.NET 中的对象序列化

    通过本篇文章的学习,相信您已经掌握了基本序列化、选择性序列化及自定义序列化的原理与实践方法。此外,还了解了如何使用不同的序列化器以及在序列化过程中需要注意的问题。希望这些知识能帮助您在实际项目中更加...

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

    6. **安全性问题**:序列化可能导致安全漏洞,因为恶意用户可以通过反序列化执行任意代码。因此,谨慎处理来自不可信源的序列化数据,并考虑使用安全的反序列化库或自定义序列化逻辑。 接下来是反序列化,它是序列...

    C#和Java的序列化反序列化

    而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...

    用序列化(Serializable)保存、读取对象

    - **序列化安全**: 序列化可以暴露敏感信息,因此需要注意安全问题,如避免序列化敏感数据、防止恶意反序列化攻击。 综上所述,Java中的序列化是一个强大的工具,但同时也需要谨慎使用,尤其是在处理敏感信息时。...

Global site tag (gtag.js) - Google Analytics