我有一些通过RMI序列化同时访问的对象。最近我写了自定义序列化方法:
/** This method is made to omit serialization of this.order */
private void writeObject(java.io.ObjectOutputStream out)
throws java.io.IOException
{
Order tmpOrder = this.order;
this.order = null;
out.defaultWriteObject();
this.order = tmpOrder;
}
private void readObject(java.io.ObjectInputStream in)
throws java.io.IOException, ClassNotFoundException
{
in.defaultReadObject();
}
我不想允许通过并发RMI线程来破坏this.order。
在第二种情况下,我的同步甚至可能导致RMI死锁。 JAVA API的一般合同是一个方法由一个线程调用,除非具体说明。因此,如果我应该遵循规则,我应该保留writeObject
w / o任何同步。这是对的吗?
在没有回答问题的情况下,我的问题的另一个解决方案肯定是声明private static final ObjectStreamField[] serialPersistentFields
。 (我不能使场瞬态,因为该对象不仅是DTO而且是JPA实体)
答案 0 :(得分:2)
我有一些RMI同时访问的对象 序列
不,不。您有一些对象可以通过对象序列化同时访问。
RMI框架是否尽力同步对象的访问?
没有。对象序列化框架可能,但未指定。
答案 1 :(得分:1)
尝试序列化同时使用的对象会导致混乱。当然要读取一致状态甚至是格式良好的状态,通常需要独占锁定。如果同步writeObject
,那么你就会遇到极端问题,确保锁定顺序很好。
添加serialPersistentFields
(拼写正确:)应该与制作字段transient
具有相同的行为。制作order
transient
会阻止它被写出来,这似乎是您在问题代码中尝试的内容。使用ObjectOutputStream.putFields
也可以实现类似的目标。