`
leonzhx
  • 浏览: 791766 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Item 76: Write readObject methods defensively

阅读更多

1.  The readObject method is effectively another public constructor, and it demands all of the same care as any other constructor. Just as a constructor must check its arguments for validity and make defensive copies of parameters where appropriate so must a readObject method.

 

2.  The problem arises when readObject is presented with a byte stream that is artificially constructed to generate an object that violates the invariants of its class.

 

3.  When an object is deserialized, it is critical to defensively copy any field containing an object reference that a client must not possess. Note that the defensive copy should be performed prior to the validity check.

 

4.  Do not use the writeUnshared and readUnshared methods. They are typically faster than defensive copying, but they don’t provide the necessary safety guarantee.

 

5.  There is one other similarity between readObject methods and constructors, concerning nonfinal serializable classes. A readObject method must not invoke an overridable method, directly or indirectly. If this rule is violated and the method is overridden, the overriding method will run before the subclass’s state has been deserialized. A program failure is likely to result.

 

6.  Here, in summary form, are the guidelines for writing a bulletproof readObject method:

    1)  For classes with object reference fields that must remain private, defensively copy each object in such a field. Mutable components of immutable classes fall into this category.

    2)  Check any invariants and throw an InvalidObjectException if a check fails. The checks should follow any defensive copying.

    3)  If an entire object graph must be validated after it is deserialized, use the ObjectInputValidation interface.

    4)  Do not invoke any overridable methods in the class, directly or indirectly.

 

分享到:
评论

相关推荐

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 88: Write readObject methods defensively Item 89: For instance control, prefer enum types to readResolve Item 90: Consider serialization proxies instead of serialized instances

    Java_一些使用JDBC的ReadObject Sink.zip

    本文将深入探讨如何使用JDBC进行数据读取,并结合"ReadObject Sink"的概念,这通常指的是从数据库读取对象并将其转换为Java对象的过程。 首先,让我们了解JDBC的基本概念。JDBC提供了一组接口和类,允许Java程序...

    Java中的序列化方法

    例如,可以通过`ObjectOutputStream`的`writeObject`方法将对象写入字节数组,然后通过`ObjectInputStream`的`readObject`方法从字节数组中读取对象。 #### 小结 本文档主要介绍了Java中序列化的基本概念和实现...

    MFC文件操作

     CArchive的 和>> 操作符用于简单数据类型的读写,对于CObject派生类的对象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()还可以进行类的读写,如:  //存储CAboutDlg类  ...

    kryo-3.0.3-all.zip

    4. **反序列化**:通过readObject()或readObjects()方法从Input流中读取对象。 四、Kryo与其他序列化框架的比较 相比于Java自带的序列化,Kryo在速度和内存效率上有显著优势。与其它如protobuf、msgpack等轻量级...

    Java安全漫谈 - 07.反序列化篇(1)1

    在Java中,反序列化通常是通过实现`Serializable`接口并在类中包含`readObject`方法来完成的。 在Java中,`readObject`方法被设计用来在反序列化过程中恢复对象的状态。与PHP的`__wakeup`魔术方法不同,`readObject...

    CFILE类用法说明

    对于复杂的对象读写,可以使用 `CArchive` 的 `WriteObject` 和 `ReadObject` 方法。 ```cpp // 写入对象 ar.WriteClass(RUNTIME_CLASS(CAboutDlg)); // 读取对象 CRuntimeClass* mRunClass = ar.ReadClass(); ...

    深入剖析Java序列化:挑战复杂的面试题与详细解析

    反序列化是将字节流恢复为原来的对象,通常使用`ObjectInputStream`的`readObject()`方法完成。 2. **序列化接口与方法**: - 序列化由对象实现`Serializable`接口来完成。 - 反序列化主要通过`ObjectInputStream...

    java高级测试题.docx

    9. **ObjectInputStream**:`readObject()`方法用于反序列化对象,当到达流的末尾时,会抛出异常`EOFException`来指示流的结束。 10. **线性表**:线性表是数据结构的一种,由有限个数据元素构成的序列。栈是一种...

    将对象、集合保存到本地,保存到sd卡

    fw.write(item + "\n"); } fw.close(); ``` 读取文件中的集合时,反向操作即可: ```java List<String> readList = new ArrayList(); BufferedReader br = new BufferedReader(new FileReader("list.txt")); ...

    JavaSE-day12每日作业卷2

    调用`readObject()`方法读取对象。 5. **字节流与打印流**: - **字节打印流的使用**:`java.io.FileOutputStream`与`java.io.PrintStream`结合,可以方便地向文件输出数据,如`PrintStream`的`print()`方法用于...

    CArchive实例

    file.Open("mydata.dat", CFile::modeCreate | CFile::modeWrite)) return FALSE; CArchive ar(&file, CArchive::store); // 创建存档 ``` 2. **序列化对象**:使用CArchive的成员函数WriteObject()或operator将...

    2018版 04747 Java语言程序设计(一)七八九十章知识点总结

    Java语言程序设计(一)七八九十章知识点总结 第七章:输入和输出流 一、数据流的基本概念 ...* 读对象用方法 readObject()把数据流以 Object 类型返回,返回内容应该在转换为正确的类型之后再执行该类的方法。

    JAVA流式输入输出与文件处理.pdf

    序列化使用ObjectOutputStream的writeObject()方法,反序列化使用ObjectInputStream的readObject()方法。对象序列化在处理临时文件、网络通信或持久化存储中非常有用。 总之,Java的流式输入输出提供了处理输入输出...

    王牌2_MFC查询手册.pdf

    - **ReadObject/WriteObject**:读取/写入对象。 - **描述**:用于读取或写入对象实例。 - **示例代码**: ```cpp CObject* pObj = new MyClass; ar.WriteObject(pObj); ``` - **ReadString/WriteString**:...

    个人笔记--Java_API

    - `readObject()`:反序列化对象。 **4.8 RandomAccessFile** - **特点**:可以随机访问文件的任意位置。 - **构造方法**: - `RandomAccessFile(File file, String mode)` #### 五、注解 **5.1 主要作用** -...

    Objective-C序列化框架KryoCocoa.zip

    KryoCocoa 是 Kryo 高性能 Java 序列化框架的 Objective-C 移植版本,兼容 Java 版本...SomeClass *someObject = [kryo readObject:input ofClass:[SomeClass class]]; [input close]; 标签:KryoCocoa

    人工智能-项目实践-搜索引擎-java实验1-实现搜索引擎的倒排索引数据结构

    java实验1-实现搜索引擎的倒排索引数据结构 实验1知识点: 集合类的使用如ArrayList,HashMap ◦对这些集合类的操作包括...具体使用方法,请见hust.cs.javacourse.search.util.FileUtils类的read方法和write方法 设计

    对象的序列化与反序列化

    - **实现`Serializable`接口并自定义序列化方法**:如果`Customer`类实现了`Serializable`接口,并定义了`writeObject`和`readObject`方法,那么序列化和反序列化操作将按照自定义的方法进行。 ```java public ...

Global site tag (gtag.js) - Google Analytics