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.
相关推荐
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 标识符java 源代码 危险 函数 识别 prog它是如何工作的?JavaID通过正则匹配的方式识别java源代码中的一些危险函数。... "readObject", "readUnshared", "Yaml.load", "fromXML", "ObjectMapper.readValue",
本文将深入探讨如何使用JDBC进行数据读取,并结合"ReadObject Sink"的概念,这通常指的是从数据库读取对象并将其转换为Java对象的过程。 首先,让我们了解JDBC的基本概念。JDBC提供了一组接口和类,允许Java程序...
例如,可以通过`ObjectOutputStream`的`writeObject`方法将对象写入字节数组,然后通过`ObjectInputStream`的`readObject`方法从字节数组中读取对象。 #### 小结 本文档主要介绍了Java中序列化的基本概念和实现...
CArchive的 和>> 操作符用于简单数据类型的读写,对于CObject派生类的对象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()还可以进行类的读写,如: //存储CAboutDlg类 ...
4. **反序列化**:通过readObject()或readObjects()方法从Input流中读取对象。 四、Kryo与其他序列化框架的比较 相比于Java自带的序列化,Kryo在速度和内存效率上有显著优势。与其它如protobuf、msgpack等轻量级...
在Java中,反序列化通常是通过实现`Serializable`接口并在类中包含`readObject`方法来完成的。 在Java中,`readObject`方法被设计用来在反序列化过程中恢复对象的状态。与PHP的`__wakeup`魔术方法不同,`readObject...
对于复杂的对象读写,可以使用 `CArchive` 的 `WriteObject` 和 `ReadObject` 方法。 ```cpp // 写入对象 ar.WriteClass(RUNTIME_CLASS(CAboutDlg)); // 读取对象 CRuntimeClass* mRunClass = ar.ReadClass(); ...
反序列化是将字节流恢复为原来的对象,通常使用`ObjectInputStream`的`readObject()`方法完成。 2. **序列化接口与方法**: - 序列化由对象实现`Serializable`接口来完成。 - 反序列化主要通过`ObjectInputStream...
9. **ObjectInputStream**:`readObject()`方法用于反序列化对象,当到达流的末尾时,会抛出异常`EOFException`来指示流的结束。 10. **线性表**:线性表是数据结构的一种,由有限个数据元素构成的序列。栈是一种...
fw.write(item + "\n"); } fw.close(); ``` 读取文件中的集合时,反向操作即可: ```java List<String> readList = new ArrayList(); BufferedReader br = new BufferedReader(new FileReader("list.txt")); ...
调用`readObject()`方法读取对象。 5. **字节流与打印流**: - **字节打印流的使用**:`java.io.FileOutputStream`与`java.io.PrintStream`结合,可以方便地向文件输出数据,如`PrintStream`的`print()`方法用于...
file.Open("mydata.dat", CFile::modeCreate | CFile::modeWrite)) return FALSE; CArchive ar(&file, CArchive::store); // 创建存档 ``` 2. **序列化对象**:使用CArchive的成员函数WriteObject()或operator将...
Java语言程序设计(一)七八九十章知识点总结 第七章:输入和输出流 一、数据流的基本概念 ...* 读对象用方法 readObject()把数据流以 Object 类型返回,返回内容应该在转换为正确的类型之后再执行该类的方法。
序列化使用ObjectOutputStream的writeObject()方法,反序列化使用ObjectInputStream的readObject()方法。对象序列化在处理临时文件、网络通信或持久化存储中非常有用。 总之,Java的流式输入输出提供了处理输入输出...
- **ReadObject/WriteObject**:读取/写入对象。 - **描述**:用于读取或写入对象实例。 - **示例代码**: ```cpp CObject* pObj = new MyClass; ar.WriteObject(pObj); ``` - **ReadString/WriteString**:...
- `readObject()`:反序列化对象。 **4.8 RandomAccessFile** - **特点**:可以随机访问文件的任意位置。 - **构造方法**: - `RandomAccessFile(File file, String mode)` #### 五、注解 **5.1 主要作用** -...
KryoCocoa 是 Kryo 高性能 Java 序列化框架的 Objective-C 移植版本,兼容 Java 版本...SomeClass *someObject = [kryo readObject:input ofClass:[SomeClass class]]; [input close]; 标签:KryoCocoa
java实验1-实现搜索引擎的倒排索引数据结构 实验1知识点: 集合类的使用如ArrayList,HashMap ◦对这些集合类的操作包括...具体使用方法,请见hust.cs.javacourse.search.util.FileUtils类的read方法和write方法 设计