在这里就简单的说一下Serializable接口,主要是在使用Findbugs插件来检查代码bug时,发现大篇幅的报Non-transient non-serializable instance field in serializable class错误。在仔细研究了下后,找到了解决方法,在这里分享一下
结论:
1、如果要可序列化某个类,需要实现Serializable接口
2、为确保序列化与反序列化一致,UID必须不可改变
3、如果不需要序列化成员变量,那么可以将这个变量标为瞬时的,修饰符:transient
4、如果需要序列化成员变量的引用,那么这个引用也需要实Serializable接口
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 本例子是将一个类持久化到硬盘中,然后再反序列化出这个对象。
* 当然如果需要在网络上传输的对象,也需要实现Serializable接口,比如RMI远程方法调用
*/
public class TestSerializable
{
//对象持久化地址
private final static String FILE_PATH = "D://student";
public static void main(String[] args)
{
writeObj();
readObj();
}
//将对象持久化到硬盘
public static void writeObj()
{
ObjectOutputStream oos = null;
FileOutputStream fos = null;
try
{
Student stu1 = new Student(17, "Tom", new Point(108, 230));
System.out.println("stu1: " + stu1);
fos = new FileOutputStream(FILE_PATH);
oos = new ObjectOutputStream(fos);
oos.writeObject(stu1);
oos.flush();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (oos != null)
{
try
{
oos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (fos != null)
{
try
{
fos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
//反序列持久化对象
public static void readObj()
{
FileInputStream fis = null;
ObjectInputStream ois = null;
try
{
Student stu2 = null;
fis = new FileInputStream(FILE_PATH);
ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
stu2 = (Student) obj;
System.out.println("stu2: " + stu2);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
finally
{
if(ois != null)
{
try
{
ois.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if(fis != null)
{
try
{
fis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
//如果要可序列化某个类,需要实现Serializable接口
class Student implements Serializable
{
//为确保序列化与反序列化一致,UID必须不可改变
private static final long serialVersionUID = 1L;
private String name;
private int age;
//如果不需要序列化成员变量,那么可以将这个变量标为瞬时的,修饰符:transient
//private transient Point point;
//如果需要序列化成员变量的引用,那么这个引用也需要实Serializable接口
private Point point;
public Student(int age, String name, Point point)
{
this.age = age;
this.name = name;
this.point = point;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public Point getPoint()
{
return point;
}
public void setPoint(Point point)
{
this.point = point;
}
@Override
public String toString()
{
return "name=" + this.getName() + ", age=" + this.getAge() + ", point{"
+ this.getPoint() + "}";
}
}
class Point implements Serializable
{
private static final long serialVersionUID = 1L;
private int x;
private int y;
public Point(int x, int y)
{
super();
this.x = x;
this.y = y;
}
public int getX()
{
return x;
}
public void setX(int x)
{
this.x = x;
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
@Override
public String toString()
{
return "x=" + x + ", y=" + y;
}
}
分享到:
相关推荐
`Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,它的实例就可以被序列化。 **一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换...
在Java中,通过实现`Serializable`接口,可以方便地进行对象的序列化操作。序列化的核心在于能够将对象的状态转换为可以存储或传输的形式,从而实现对象的持久化和远程通信等功能。 #### 二、序列化的应用场景 ...
序列化的核心接口是 `java.io.Serializable`,它是一个标记接口,没有定义任何方法,用于标记可以被序列化的类。 #### 二、实现序列化的方法 为了使一个类支持序列化,需要让该类实现 `Serializable` 接口。实现这...
在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被序列化。序列化的目的是为了能够持久地保存对象的状态,或者在网络中传递对象。 序列化主要关注的是对象的状态(即其实例变量),而不是其...
在 Java 中,序列化和反序列化是通过实现 Serializable 接口来实现的。Serializable 接口是一个标记接口,不包含任何方法,但它告诉 Java虚拟机(JVM)该类可以被序列化。 在上面的代码中,我们可以看到 ...
当你在一个类上声明实现了这个接口,你实际上是在告诉JVM(Java虚拟机)该类的对象可以被序列化。序列化是指将对象的状态转换为字节流的过程,这使得对象可以在网络上传输或保存到磁盘上,以便稍后恢复其状态。 **...
1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...
2. **序列化接口**: - 在Java中,如果一个类想要实现序列化,只需实现`Serializable`接口即可,但该接口没有任何方法,只是一个标志接口。 3. **序列化过程**: - 使用`ObjectOutputStream`类的`writeObject()`...
而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...
通过实现`Serializable`接口,一个Java对象就可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅表示对象支持序列化。 二、为什么需要Java序列化 1. 持久化:序列化可以将对象状态持久化到磁盘,以便下次...
本文将深入探讨Android中的Serializable序列化机制,包括其原理、使用场景以及注意事项。 一、Serializable接口概述 Serializable接口是Java提供的一种序列化机制,它允许对象的状态被转换成字节流,以便于存储或者...
2. **接口**: 实现序列化的类需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但是通过实现这个接口,表明类的对象是可以被序列化的。 3. **过程**: - 序列化:使用`java.io....
Java中的序列化主要通过实现`java.io.Serializable`接口来完成。虽然这个接口没有任何方法,但是它的存在就表明该类的对象可以被序列化。当一个对象被序列化时,其所有字段(包括私有的)都会被包含在字节流中,除非...
### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的状态转换成字节流的过程,以便于在网络上传输或存储到磁盘上。Java序列化标准定义了一套规则来描述如何...
2. **序列化接口** - `java.io.Serializable` 是Java序列化的基础,任何类如果想要实现序列化,就必须实现这个接口。这个接口是一个标记接口,没有定义任何方法,只是表明该类的对象可以被序列化。 3. **序列化...
**Serializable序列化** 在Java编程语言中,`Serializable`接口是一个非常重要的概念,它涉及到对象的状态持久化和网络传输。序列化是将一个对象转换为字节流的过程,这样就可以将其保存到磁盘、数据库或者在网络中...
要实现一个对象的序列化,该对象的类必须实现`Serializable`接口。这是一个标记接口,没有包含任何方法,只是表明该类的对象是可以被序列化的。 下面是一些关于序列化的重要知识点: 1. **序列化标识符...
Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。 Serializable...
要实现对象序列化,Java类必须实现`Serializable`接口或`Externalizable`接口。`Serializable`接口是一个空接口,当一个类实现它时,表明该类的所有实例都可以被序列化。而`Externalizable`接口提供了更多的控制权,...