java 序列化接口_【总结】Java序列化,反序列化实例(属性类不实现序列化接口)...

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

Java中String, Integer的父类都实现了序列化接口

Person类实现了序列化接口,Person中的所有属性也必须实现序列化接口,package serialize;

import java.io.Serializable;

/**

ClassName: Person

Description:测试对象序列化和反序列化

* @author 巧克力黑

* @version 1.0 V

* @createTime 2016-03-18

*/

public class Person implements Serializable {

/**

* 序列化ID

*/

private static final long serialVersionUID = -5809782578272943999L;

private String name;

private Pet pet;

public Person(String name, String sex, int age, Pet pet) {

this.name = name;

this.pet = pet;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Pet getPet() {

return pet;

}

public void setPet(Pet pet) {

this.pet = pet;

}

}

Pet类,也是Person中的一个属性,此处Pet没有实现Serializablepackage serialize;

/**

*

* @author 巧克力黑

* @version 1.0 V

* @createTime 2016-03-18

*

*/

class Pet{

private String name;

public Pet(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return this.name;

}

}

测试类package serialize;

import java.io.File;

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 org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

ClassName: TestSerializeAndDeserialize

Description: 测试对象的序列化和反序列

* @author 巧克力黑

* @version 1.0 V

* @createTime 2016-03-18

*/

public class TestSerializeAndDeserialize {

private static Logger logger = LoggerFactory.getLogger(TestSerializeAndDeserialize.class);

public static void main(String[] args) throws Exception {

serializePerson();//序列化Person对象

Person p = deserializePerson();//反序列Perons对象

logger.info("name={},pet={}", p.getName(),p.getPet().toString());

}

private static void serializePerson() throws FileNotFoundException,

IOException {

Person person = new Person("qiaokeli", "男", 25, new Pet("旺财"));

//ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作

ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("E:/Person.txt")));

oo.writeObject(person);

logger.info("将Person序列化到文件");

oo.close();

}

private static Person deserializePerson() throws Exception, IOException {

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("E:/Person.txt")));

Person person = (Person) ois.readObject();

logger.info("反序列化Person对象");

return person;

}

}

在Pet没有实现Serializable接口的情况下,看看控制台运行错误Exception in thread "main" java.io.NotSerializableException: serialize.Pet

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)

at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)

at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)

at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)

at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

at serialize.TestSerializeAndDeserialize.serializePerson(TestSerializeAndDeserialize.java:36)

at serialize.TestSerializeAndDeserialize.main(TestSerializeAndDeserialize.java:25)

FindBugs提示错误Bug: Class serialize.Person defines non-transient non-serializable instance field pet

This Serializable class defines a non-primitive instance field which is neither transient, Serializable, or java.lang.Object, and does not appear to implement the Externalizable interface or the readObject() and writeObject() methods.  Objects of this class will not be deserialized correctly if a non-Serializable object is stored in this field.

Rank: Troubling (14), confidence: HighPattern: SE_BAD_FIELD Type: Se, Category: BAD_PRACTICE (Bad practice)

结论:

由于Person中的Pet属性没有实现序列化接口serializable,在执行序列化,反序列化过程中就会出错。

解决办法就是将Pet也实现序列化接口。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值