`

java 反序列化时对象的static属性序列化问题。

阅读更多
代码仅供自己参考。



package com.zhi.learnj;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class StoreCadState {
	
	public static void main(String[] args) throws Exception {
		
		List<Class<? extends Shape>> shapeTypes = new ArrayList<>();
		shapeTypes.add(Circle.class);
		shapeTypes.add(Square.class);
		shapeTypes.add(Line.class);
		
		List<Shape> shapes = new ArrayList<>();
		System.out.println("random generate ten shapes");
		for(int i=0; i<10; i++){
			shapes.add(Shape.randomFactory());
		}
		System.out.println("set color of all shapes to GREEN");
		for(int i=0; i<10; i++){
			shapes.get(i).setColor(Shape.GREEN);
		}
		
		ObjectOutputStream oos = new ObjectOutputStream(
				new FileOutputStream("cadstore.txt"));
		oos.writeObject(shapeTypes);
		Line.serializeStaticState(oos);
		oos.writeObject(shapes);
		
		oos.close();
		System.out.println(shapes);
	}
	/**
random generate ten shapes
set color of all shapes to GREEN
[class com.zhi.learnj.Circle, color=3, xPos=58, yPos=55, dimension=93
, class com.zhi.learnj.Square, color=3, xPos=61, yPos=61, dimension=29
, class com.zhi.learnj.Line, color=3, xPos=68, yPos=0, dimension=22
, class com.zhi.learnj.Circle, color=3, xPos=7, yPos=88, dimension=28
, class com.zhi.learnj.Square, color=3, xPos=51, yPos=89, dimension=9
, class com.zhi.learnj.Line, color=3, xPos=78, yPos=98, dimension=61
, class com.zhi.learnj.Circle, color=3, xPos=20, yPos=58, dimension=16
, class com.zhi.learnj.Square, color=3, xPos=40, yPos=11, dimension=22
, class com.zhi.learnj.Line, color=3, xPos=4, yPos=83, dimension=6
, class com.zhi.learnj.Circle, color=3, xPos=75, yPos=10, dimension=42
]

	 */
	
	public static class RecoverCadState{
		@SuppressWarnings("unchecked")
		public static void main(String[] args) throws Exception {
			Square square = new Square(-1, -1, -1);
			square.setColor(Shape.RED);
			//如果不注释掉上面代码,Sqaure color = RED. 
			// 之前看书的时候没有注意到这部分。Class对象在一个jvm 中是唯一的,因此,在反序列化对象的时候,对象的static属性的值是当前jvm 中Class相关的static 值。
			// 如Squre.color = RED;  因此在反序列化后,Squre 对象中所有的color 都是RED
			
			ObjectInputStream ois = new ObjectInputStream(
					new FileInputStream("cadstore.txt"));
			List<Class<? extends Shape>> shapeTypes = (List<Class<? extends Shape>>) List.class.cast(ois.readObject());
			Line.deserializeStaticState(ois);
			List<Shape> shapes = (List<Shape>) List.class.cast(ois.readObject());
			System.out.println(shapes);
			
		}
	}

}

abstract class Shape implements Serializable{
	public static final int RED = 1, BLUE = 2, GREEN = 3;
	private static Random rand = new Random(47);
	private static int counter = 0;
	
	private int xPos, yPos, dimension;

	public Shape(int xPos, int yPos, int dimension){
		this.xPos = xPos;
		this.yPos = yPos;
		this.dimension = dimension;
	}
	
	public static Shape randomFactory(){
		int xPos = rand.nextInt(100);
		int yPos = rand.nextInt(100);
		int dimension = rand.nextInt(100);
		
		switch(counter++ % 3){
		default:
		case 0: return new Circle(xPos, yPos, dimension);
		case 1: return new Square(xPos, yPos, dimension);
		case 2: return new Line(xPos, yPos, dimension);
		}
	}
	
	public abstract void setColor(int newColor);
	public abstract int getColor();
	
	@Override
	public String toString() {
		return getClass()+", color="+getColor()+", xPos="+xPos+", yPos="+yPos+", "
				+ "dimension="+dimension+"\n";
	}

}
class Line extends Shape{
	private static int color = RED;
	
	public Line(int xPos, int yPos, int dimension) {
		super(xPos, yPos, dimension);
	}
	
	public static void serializeStaticState(ObjectOutputStream oos) 
			                                                      throws IOException{
		oos.writeInt(color);
	}
	
	public static void deserializeStaticState(ObjectInputStream ois)
	                                                               throws IOException{
		color = ois.readInt();
	}

	@Override
	public void setColor(int newColor) {
		color = newColor;
	}

	@Override
	public int getColor() {
		return color;
	}
	
}
class Square extends Shape{
	private static int color;
	
	public Square(int xPos, int yPos, int dimension) {
		super(xPos, yPos, dimension);
		color = RED;
	}

	@Override
	public void setColor(int newColor) {
		color = newColor;
	}

	@Override
	public int getColor() {
		return color;
	}
}

class Circle extends Shape{
	private static int color = RED;

	public Circle(int xPos, int yPos, int dimension) {
		super(xPos, yPos, dimension);
	}

	@Override
	public void setColor(int newColor) {
		color = newColor;
	}

	@Override
	public int getColor() {
		return color;
	}
	
}
分享到:
评论

相关推荐

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

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    java serializable 序列化与反序列化

    **一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换为可以存储或传输的数据格式的过程。在Java中,通常是将对象转换为字节数组,以便写入磁盘或通过网络发送。 2. **为什么需要...

    使用XStream序列化/反序列化对象

    由于XStream使用Java类型信息来构建XML,因此在反序列化时,它可以确保对象的类型正确无误。此外,XStream还提供了自定义转换器的功能,以便处理自定义的序列化逻辑。 总结起来,XStream是一个强大的工具,用于在...

    Java 多次序列化对象到同壹個文件及反序列化的问题

    总之,Java的序列化和反序列化是一个需要谨慎处理的过程,尤其是在多次操作和维护长期存储的对象时。理解`serialVersionUID`的作用,选择合适的序列化策略,并注意类结构的修改,是避免问题的关键。

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

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

    关于 Java 对象序列化您不知道的 5 件事

    Java对象序列化是Java平台的一项重要特性,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在本文中,我们将深入探讨关于Java对象序列化你可能不知道的五件事情,这些知识点对于理解和优化你的Java应用程序...

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

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    Java对象的序列化和反序列化实践

    在Java编程语言中,对象的序列化和反...总结,Java对象的序列化和反序列化是Java开发中的重要技能,它们可以帮助我们处理数据持久化、网络通信等问题。了解并熟练掌握这些技术,将有助于提升软件的稳定性和可维护性。

    java程序,序列化和反序列化操作对文件的运用

    如果要修改已序列化的对象,我们通常会先读取文件,反序列化为对象,修改对象属性,然后重新序列化并覆盖原文件。这个过程需要注意的是,如果类的结构(如字段的添加或删除)发生了变化,那么反序列化可能会失败,...

    java序列化和反序列化

    ### Java序列化与反序列化详解 #### 一、Java序列化概述 Java序列化(Serialization...综上所述,Java序列化提供了一种简单有效的方式来处理对象的持久化和传输需求,但开发者也需要考虑其可能带来的性能和安全问题。

    Java对象的序列化与反序列化Java开发Java经验技巧

    - **重要性**:Java序列化机制依赖于`serialVersionUID`字段来验证序列化版本的一致性。 - **默认生成**:当类首次序列化时,JVM会根据类的结构自动生成一个`serialVersionUID`。 - **手动指定**:为了确保反序列...

    Java反序列化回显解决方案.docx

    Java序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。相反,反序列化则是在适当的时候把这个流转换回原对象的过程。当应用程序接收来自不受信任源的数据并进行反序列化时,可能触发安全漏洞。例如,...

    JAVA对象序列化保存为XML文件的工具类

    以下是一个简单的示例,展示了如何使用`ObjectToXMLUtil`工具类将Java对象序列化到XML文件以及从XML文件中反序列化: ```java public class Test { public static void main(String[] args) { // 创建一个示例...

    java中的序列化与反序列化

    Java序列化机制的优点在于它提供了一种标准的方式来处理对象的持久化和在网络间的传输。然而,序列化也存在安全风险,比如序列化可能导致远程代码执行攻击。因此,对于敏感信息或复杂对象结构,应谨慎使用序列化,并...

    什么是Java的序列化和反序列化?如何实现对象的序列化和反序列化?(java面试题附答案).txt

    在Java中,实现对象的序列化和反序列化主要依赖于`Serializable`接口。这是一个标记接口,意味着它没有提供任何方法,仅仅是告诉JVM该对象支持序列化。具体实现方式如下: 1. **序列化**: - 实现`Serializable`...

    Java序列化_Java序列化结构_

    Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...

    java自动序列化

    Java序列化是将对象转换为字节流的过程,目的是为了保存对象的状态以便稍后恢复或传输到其他地方。通过实现`Serializable`接口,一个Java对象就可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅表示对象...

    Java 文件 序列化 读写

    Java文件序列化是Java平台中一种重要的数据存储和交换机制,它允许我们将对象的状态转换为字节流,以便可以保存到磁盘、网络传输或在内存中存储,然后在需要时将这些字节流恢复为原来的对象。这个过程称为序列化...

    Java对象序列化的秘密

    3. **备份和恢复**: 对象序列化可以作为备份策略,当系统出现问题时,可以从序列化的数据中恢复。 4. **缓存**: 序列化可以将对象转化为字节流存储在内存中,提高缓存效率。 5. **跨进程通信(RMI)**: Remote ...

    Java中的序列化与反序列化.pdf

    Java序列化是Java平台提供的一种持久化机制,它允许我们将Java对象转换成字节流,以便于存储或者在网络中传输。这一过程被称为序列化,而将字节流还原成原来的对象则称为反序列化。在Java中,实现序列化主要通过实现...

Global site tag (gtag.js) - Google Analytics