(ObjectOutputStream.java:1174) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346...) at Serializations.serialize(Serializations.java:26) at WriteObject.main(WriteObject.java:13) ...writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它。...所以,我们可以在Name类中加入如下方法: private void writeObject(java.io.ObjectOutputStream out) throws IOException...运行WriteObject和ReadObject,序列化和反序列化成功。这两个方法如何实现取决于最终的需求,上面的例子是我想的一个比较符合应用场景的实例。
writeObject和readObject方法 在ArrayList中定义了来个方法: writeObject和readObject。...这里先给出结论: 在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化...为了节省篇幅,这里给出ObjectOutputStream的writeObject的调用栈: writeObject ---> writeObject0 --->writeOrdinaryObject-...中定义的writeObject方法。...其实这个问题也很好回答,我们再回到刚刚ObjectOutputStream的writeObject的调用栈: writeObject ---> writeObject0 --->writeOrdinaryObject
利用ByteArray.writeObject可以把对象以AMF方式序列化。 3、但是,直接把两个MovieClip序列化,得到的ByteArray肯定不一样,因为毕竟有动态的变量值,例如x/y等。...4、那么如果不直接对MovieClip本身writeObject,而是对它的子元件writeObject呢?...再结合ByteArray.writeObject就可以轻松比较到两个Shape是否一致了。 6、利用上边Shape的思维,对MovieClip也做一样的处理。...每帧获取graphics数据,writeObject到ByteArray中。最后做比较。...var shapeB:Shape = b as Shape; byteArrayA.writeObject
(ObjectOutputStream.java:1178) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348...()方法,这样一来,序列化的时候调用的就是writeObject(),而不是java.io.ObjectOutputStream.defaultWriteObject()。...下面的源码是ObjectInputStream.writeObject(Object obj),里面底层其实会有反射的方式调用到重写的对象的writeObject()方法,这里不做展开。...public final void writeObject(Object obj) throws IOException { // 如果可以被重写,那么就会调用重写的方法...这里不写入score */ out.writeObject(age); out.writeObject(name); out.writeObject
序列化和反序列化结果 这是最简单的一种方式,因为这种方式让序列化机制看起来很方便(然后,我们在进行对象序列化时,只需要使用ObjectOutputStream和ObjectInputStream的writeObject...第三种 实现Serializable接口,在该实现类中再增加writeObject方法和readObject方法。...修饰的成员变量,static的和transient的变量则用stream.writeObject(object)显式序列化。...在序列化输出的时候,writeObject(object)会检查object参数,如果object拥有自己的writeObject()方法,那么就会使用它自己的writeObject()方法进行序列化。...如果object参数没有writeObject()方法,在readObject方法中就不能调用stream.readObject(),否则会报错。 例如: ? 序列化举例
二、部分属性序列化 如果只想将部分属性进行序列化,可以采用如下几种方法: 使用transient关键字 添加writeObject和readObject方法 使用Externalizable实现 2.1...和readObject方法 另外,我们也可以采用编写私有方法writeObject和readObject,完成部分属性的序列化。...修改Book类,增加writeObject 和 readObject方法,如: public class Book implements Serializable { private static...和readObject是private的且是void的~ Java调用ObjectOutputStream类检查其是否有私有的,无返回值的writeObject方法,如果有,其会委托该方法进行对象序列化...writeObjectMethod = getPrivateMethod(cl, "writeObject", new Class<?
writeObject和readObject方法 在ArrayList中定义了来个方法: writeObject 和 readObject 。...这里先给出结论: 在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化...为了节省篇幅,这里给出ObjectOutputStream的writeObject的调用栈: writeObject — writeObject0 —writeOrdinaryObject—writeSerialData—invokeWriteObject...中定义的writeObject方法。...其实这个问题也很好回答,我们再回到刚刚ObjectOutputStream的writeObject的调用栈: writeObject — writeObject0 —writeOrdinaryObject—writeSerialData—invokeWriteObject
实现序列化 ObjectInputStream#readObject方法实现反序列化 序列化底层实现分析 writeObject(Object) FAQ ---- what 把Java对象转换为字节序列的过程...---- writeObject(Object) 序列化的方法就是writeObject, debug下 writeObject直接调用的就是writeObject0()方法 public final...void writeObject(Object obj) throws IOException { .........writeObject0(obj, false); ...... } private void writeObject0(Object obj, boolean unshared)...//递归调用writeObject0()方法,写入对应的数据 writeObject0(objVals[i], fields
writeObject和readObject方法 在ArrayList中定义了来个方法:writeObject和readObject。...这里先给出结论: 在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化...为了节省篇幅,这里给出ObjectOutputStream的writeObject的调用栈: writeObject ---> writeObject0 --->writeOrdinaryObject-...中定义的writeObject方法。...其实这个问题也很好回答,我们再回到刚刚ObjectOutputStream的writeObject的调用栈: writeObject ---> writeObject0 --->writeOrdinaryObject
2、如何实现序列化 2.1、使用到JDK中关键类 ObjectOutputStream 和ObjectInputStream ObjectOutputStream 类中:通过使用writeObject...2.3.2 第二种写入方式: 在Student 类中实现writeObject()和readObject()方法: private void writeObject(ObjectOutputStream...(name); out.writeObject(id); } @Override public void readExternal(ObjectInput in...()和readObject()方法 2.2 通过在序列化对象中实现writeObject()和readObject()方法,传入ObjectOutputStream和ObjectInputStream对象...我们可以通过上述序列化方法中的 实现writeObject 和readObject 方法,在方法中调用输出流或输入流的writeUTF()和readUTF()方法。
2、调用writeObject() 方法。 writeObjectOverride() 方法 ? 通过源码发现这个方法是个空方法,这是搞什么鬼?...writeObject0方法 ? 在 writeObject0() 方法中,跳过一些检查操作,直接分析最核心的这段代码。...1、判断该类是否定义了 writeObject() 方法,如果定义了,则通过反射调用该对象的 writeObject() 方法,执行我们自己定义的序列化规则。...2、没有定义writeObject() 方法,则调用 defaultWriteFields() 方法执行默认的序列化规则。...我们平常在重写 writeObject() 方法的时候一般也会先调用 defaultWriteFields() 方法的,然后在写上其它特殊的序列化。
(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348...所以呀,Serializable真的只是一个标志,一个序列化标志~ writeObject(Object) 序列化的方法就是writeObject,基于以上的demo,我们来分析一波它的核心方法调用链吧...writeObject直接调用的就是writeObject0()方法, public final void writeObject(Object obj) throws IOException {...writeObject0(obj, false); ......} writeObject0 主要实现是对象的不同类型,调用不同的方法写入序列化数据,这里面如果对象实现了Serializable接口...//递归调用writeObject0()方法,写入对应的数据 writeObject0(objVals[i], fields
我们都知道,序列化不会自动保存static和transient变量,因此我们若要保存它们,则需要通过writeObject()和readObject()去手动读写,所以通过writeObject()方法...ArrayList的私有方法writeObject(快速失败) /** * The array buffer into which the elements of the ArrayList...elements * (each an Object) in the proper order. */ private void writeObject...for (int i=0; i<size; i++) { s.writeObject(elementData[i]); } if (modCount...Vector的私有方法writeObject(安全失败) 我们走读下 Vector 的 writeObject(java.io.ObjectOutputStream s) 方法: /**
类可以实现writeObject方法,以自定义该类对象的序列化过程,其声明必须为: private void writeObject(java.io.ObjectOutputStream s) throws...否则的话,如LinkedList,那就可以使用transient关键字,实现writeObject和readObject来自定义序列化过程。...关键在ObjectOutputStream的writeObject和ObjectInputStream的readObject方法内。...writeObject的基本逻辑是: 如果对象没有实现Serializable,抛出异常NotSerializableException。...如果对象实现了writeObject方法,调用它的自定义方法。
new User(); user1.setUserName("zhangsan"); user1.setPassword("123456"); oos.writeObject...(this.userName); out.writeObject(this.password); } @Override public void readExternal...(this.userName); out.writeObject("externalizable:"+this.password); } @Override public...在 readObject 和 writeObject 方法中实现了序列化和发序列化。 在 readExternal 和 writeExternal 方法中也实现了序列化和发序列化。...(this.userName); out.writeObject("externalizable:"+this.password); } @Override public
领取专属 10元无门槛券
手把手带您无忧上云