`

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 SE编程入门教程 java序列化(共14页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    序列化和反序列化1

    序列化ID 两个类的序列化ID相同才能保证反序列的对象是一致private static final long serialVersionUID在序列化过程中,

    3分钟读阿里Java手册: 序列化

    前言 下面这句代码,相信大家可能跟我一样都非常熟悉,但是真正了解的人又有多少呢? private static final long serialVersionUID = 1L;...Java序列化保留了对象类的元数据(类、继承类等),以及对象数据,兼容性好

    Java序列化类库protostuff.zip

    protostuff 是一个支持各种格式的一个序列化Java类库,包括 JSON、XML、YAML等格式。示例代码:public class UserSchema implements Schema {  public boolean isInitialized(User user)  {  return...

    Java快速序列化库FST.zip

    FST fast-serialization 是重新实现的 Java 快速对象序列化的开发包。序列化速度更快(2-10倍)、体积更小,而且兼容 JDK 原生的序列化。要求 JDK 1.7 支持。 Maven:  &lt;groupId&gt;de.ruedigermoeller  ...

    JavaEE技术问题汇总.docx

    如何实现Java序列化与反序列化.序列化和反序列化使用的API 如何实现Java中的一个对象中某一个属性不被序列化,如何实现呢? Java中堆内存和栈内存区别 讲一讲反射,主要是概念,都在哪需要反射机制 JSP中有个...

    Java SE编程入门教程 java static final(共24页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    DSON-Java:总督序列化对象表示法(http

    Doge序列化对象表示法( )的完整,零依赖Java实现。 支持序列化和解析。 正确地将所有数字从和转换为八进制。 一些代码使用名称,以使Shiba Inu狗更容易理解该代码。 用法 public static class DogeExample { ...

    Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    JAVA基础课程讲义

    JAVA对象的序列化和反序列化 161 为什么需要序列化和反序列化 161 对象的序列化主要有两种用途 161 序列化涉及的类和接口 162 序列化/反序列化的步骤和实例 162 综合的序列化和反序列化练习 163 JAVA.IO包相关流对象...

    Java SE编程入门教程 java判断循环(共79页).ppt

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    LcxXmlSerialize:描述这是一个类似于gson和Jackson解析JSON的项目,旨在对XML进行序列化和反序列化

    这是一个类似于gson和Jackson解析JSON的项目,旨在对XML进行序列化和反序列化。 如何使用 目的 public static void main( String [] args) throws Exception { User record = new User (); record . setId( 10 )...

    Java SE编程入门教程 java泛型(共11页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    pvDataNativeJava:使用 POJO 实现 pvData 序列化

    pvDataNativeJava 该项目使用 POJO 实现 pvData 序列化,而不是 pvData PV 容器类。 pvData 自省接口类和机制,其中使用 Java 反射 API 替换。 用法: 首先定义一个简单的Java POJO类: public static class MyData{...

    Java开发技术大全(500个源代码).

    ObjectFileTest.java 序列化对象示例 ReadAndWrite.java 读入和写出数据 ReadAndWriteFile.java 读入数据写出到文件 Student.java 定义一个用来序列化的类 ThreadIn.java 接收数据用的线程类 ThreadOut.java ...

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    Java SE编程入门教程 java instanceof(共3页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    Java SE编程入门教程 java object(共9页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    Java SE编程入门教程 java异常(共57页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

Global site tag (gtag.js) - Google Analytics