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

java 序列化之当序列化遭遇继承,组合,对象引用

    博客分类:
  • java
 
阅读更多
public class Serial extends SerializableEr implements Serializable{
    private static final Logger LOG = Logger.getLogger(Serial.class);
    int id;
	String name;
	private static final Test test =new Test();
	public Serial(int id, String name) {
		this.id = id;
		this.name = name;
	}
	public String toString() {
		return "DATA: " + id + " " +name+super.test;

	}
	public static void main(String[] args) throws Exception{
        Serial serial=new Serial(1,"4234");
        System.out.println("object serial:"+serial); 
        try{
            FileOutputStream fos=new FileOutputStream("serialTest.txt"); 
            ObjectOutputStream oos=new ObjectOutputStream(fos); 
            oos.writeObject(serial); 
            oos.flush(); 
            oos.close(); 
        }catch(Exception e){
            System.out.println("Exception:"+e); 
        }
        a();
    }
  public static void a()throws Exception{
      FileInputStream fos=new FileInputStream("serialTest.txt"); 
      ObjectInputStream oos=new ObjectInputStream(fos); 
      Object o=  oos.readObject();
      System.out.println(o);
  }	
	

 

public class Test {
   
}

 

 

public class SerializableEr {
    
    Test test =new Test();
   // public SerializableEr(){};
}

 

运行结果:object serial:DATA: 1 4234ser.Test@9971ad
DATA: 1 4234ser.Test@1bf6770
当把  Serial  改为 private static final Test test =new Test();

public class Serial extends SerializableEr implements Serializable{
    private static final Logger LOG = Logger.getLogger(Serial.class);
    int id;
	String name;
	/*private static final*/ Test test =new Test();
	public Serial(int id, String name) {
		this.id = id;
		this.name = name;
	}
	public String toString() {
		return "DATA: " + id + " " +name+super.test;

	}
	public static void main(String[] args) throws Exception{
        Serial serial=new Serial(1,"4234");
        System.out.println("object serial:"+serial); 
        try{
            FileOutputStream fos=new FileOutputStream("serialTest.txt"); 
            ObjectOutputStream oos=new ObjectOutputStream(fos); 
            oos.writeObject(serial); 
            oos.flush(); 
            oos.close(); 
        }catch(Exception e){
            System.out.println("Exception:"+e); 
        }
        a();
    }
  public static void a()throws Exception{
      FileInputStream fos=new FileInputStream("serialTest.txt"); 
      ObjectInputStream oos=new ObjectInputStream(fos); 
      Object o=  oos.readObject();
      System.out.println(o);
  }	
	
}

   

object serial:DATA: 1 4234ser.Test@9971ad
Exception:java.io.NotSerializableException: ser.Test
Exception in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ser.Test
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at ser.Serial.a(Serial.java:40)
	at ser.Serial.main(Serial.java:35)
Caused by: java.io.NotSerializableException: ser.Test
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at ser.Serial.main(Serial.java:29)

 总结:

  事实证明。

 1:java的序列化时 。只是序列化jvm堆上的对象以及属性对象,,像静态变量就可以不实现序列化接口,因为静态变量在存在与方法区的,

场景2:

public class Serial extends SerializableEr {
    private static final Logger LOG = Logger.getLogger(Serial.class);
    int id;
	String name;
	private static final Test test =new Test();
	public Serial(int id, String name) {
		this.id = id;
		this.name = name;
	}
	public String toString() {
		return "DATA: " + id + " " +name+super.test;

	}
	public static void main(String[] args) throws Exception{
        Serial serial=new Serial(1,"4234");
        System.out.println("object serial:"+serial); 
        try{
            FileOutputStream fos=new FileOutputStream("serialTest.txt"); 
            ObjectOutputStream oos=new ObjectOutputStream(fos); 
            oos.writeObject(serial); 
            oos.flush(); 
            oos.close(); 
        }catch(Exception e){
            System.out.println("Exception:"+e); 
        }
        a();
    }
  public static void a()throws Exception{
      FileInputStream fos=new FileInputStream("serialTest.txt"); 
      ObjectInputStream oos=new ObjectInputStream(fos); 
      Object o=  oos.readObject();
      System.out.println(o);
  }	
	
}

 

public class SerializableEr implements Serializable{
    
    Test test =new Test();
   // public SerializableEr(){};
}

  结果:

object serial:DATA: 1 4234ser.Test@9971ad
Exception:java.io.NotSerializableException: ser.Test
Exception in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ser.Test
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at ser.Serial.a(Serial.java:40)
	at ser.Serial.main(Serial.java:35)
Caused by: java.io.NotSerializableException: ser.Test
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at ser.Serial.main(Serial.java:29)

 

 

 

 2:java的序列化时 。当子类实现了序列化接口时,就只序列化子类,及属性,当子类没有实现序列化接口时,就要序列化子类,同时还要序列化实现了序列化接口的父类及属性,

 

分享到:
评论

相关推荐

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

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

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

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

    java序列化全解

    Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...

    Java序列化的机制和原理

    Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在后续时间重新创建相同对象的机制。这是Java编程中一个非常重要的概念,尤其是在分布式环境和持久化存储中。让我们深入探讨一下Java...

    JAVA对象的序列化与反序列化详细PPT课件.pptx

    当两个Java进程需要通过网络通信时,由于网络只支持二进制数据的传输,因此需要将Java对象转换为字节流,然后在接收方再将字节流还原为原来的对象,这个过程就是反序列化。 Java提供了一套标准的序列化API,包括`...

    Java_序列化的高级认识

    Java序列化作为Java技术体系中的一个重要组成部分,其核心功能在于能够将Java对象转换成字节流,从而实现对象的持久化存储或是通过网络传输。然而,序列化的应用远不止于此,它还涉及到一系列复杂的概念和技术细节,...

    Java对象序列化

    1. **魔数**:标识文件为Java序列化文件,固定为`ACED`。 2. **序列化协议版本号**:目前常用的版本号为`0005`。 3. **对象类型标志**:一个字节用于表示对象类型。例如`0x73`表示普通Java对象。 4. **类或引用标志*...

    C#对象序列化与反序列化

    - **类型继承与反序列化**:当存在继承关系时,可以使用`[XmlInclude]`特性来包含子类型。 - **排除不需要序列化的成员**:使用`[XmlIgnore]`特性来排除某个成员。 - **强制指定成员的序列化顺序**:使用`...

    如何正确的使用Java序列化技术

    Java序列化技术提供了强大的功能,使开发者能够轻松地在网络上传输对象或将对象持久化到各种存储介质中。然而,为了充分利用这一特性,开发者需要深入了解其内部机制和最佳实践。本文详细介绍了Java序列化技术的基础...

    java序列化和反序列化1

    Java的序列化和反序列化是Java开发中重要的概念,主要涉及对象状态的持久化以及在网络传输中的数据转换。在Java中,序列化是将一个对象转换为字节序列的过程,而反序列化则是将字节序列恢复为原始对象的过程。 1. *...

    java对象实现序列化

    在Java编程语言中,序列化是一个重要的特性,它允许我们将对象的状态转换为字节流,以便存储或在网络中传输。这个过程称为对象的序列化,而反序列化则是将字节流恢复为原来的对象状态。在本文中,我们将深入探讨Java...

    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编程入门教程 ...

    Java序列化与反序列化

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

    Java序列化(Serializable)与反序列化_.docx

    ### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...

    hashtable序列化与反序列化

    在Java中,对象序列化允许我们将一个对象转换为字节流,这样就可以保存到磁盘、发送到网络或者存储在数据库中。`HashTable`,作为Java中的一个内置集合类,也可以被序列化。`HashTable`继承自`Dictionary`类,并实现...

    什么是java序列化,如何实现java序列化?.pdf

    Java 序列化是将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统...

    什么是java序列化,如何实现java序列化?借鉴.pdf

    Java 序列化是指将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等...

    流程控制 网络编程 对象序列化

    ### 流程控制、网络编程与对象序列化:Java中的关键技术点 #### 一、对象序列化:数据的持久化与传输 **1.1 序列化目标** 对象序列化是Java中一种用于将对象状态转换为可以存储或传输的形式的过程。其主要目标有...

    java序列化

    Java序列化是Java平台提供的一种持久化对象状态的机制,它可以将对象转换成字节流,以便存储到磁盘上,或者在网络中进行传输。这一过程被称为对象的序列化。相反,将字节流还原为原来的对象的过程叫做反序列化。 ...

Global site tag (gtag.js) - Google Analytics