【问题标题】:Serialization and Composition序列化和组合
【发布时间】:2014-01-12 14:14:50
【问题描述】:

我有一个 BaseRecord 类,它代表一个实现 Serializable ..的 DBRecord ..

我需要另一个 DB 触发器排序功能,它有自己的数据成员 = 触发激活事件数据 => 满足时会插入 BaseRecord

所以我的问题是

  • 我应该在这里使用组合还是继承?我会选择组合作为更好的说法 TriggerRecord HAS-A BaseRecord 即在触发激活事件发生时插入..
  • 还有一件事是 BaseRecord 实现了 Serializable,用户可以根据操作模式修改 BaseRecords(最终是 DB Records)AND 修改 TriggerRecord 所以我需要 BaseRecords(toString(), getter、setter 和其他数据修改)和 TriggerRecord(BaseRecords 方法以及触发器激活事件数据处理方法)

所以..

class BaseRecord implements Serializable
{
      ...
      ...
}

class TriggerRecord
{
EventData eventData;        //Non-custom Objects
BaseRecord br;
}

所以我的问题

  • 在这种情况下我是否应该使用组合?
  • 并且通过网络序列化发送 TriggerRecord ArrayList 将自动实现,因为 TriggerRecord 的所有数据成员都是可序列化的,还是我需要使用 SerialVersionUID 显式实现可序列化?

编辑 1: 截至目前TriggerRecord只有1个BaseRecord的自定义对象,可能会添加更多..本质上TriggerRecord也是另一个映射到具有eventData和BaseRecord存储格式不同的数据库记录,因为它存储了超过1个关系的BaseRecords..

如果我扩展 BaseRecord,那么我将不得不使用 super.toString() 来访问 BaseRecord 的字符串表示形式。 我只是尝试在 TriggerRecord 中组合 BaseRecord .. 即使所有数据成员都已经是 Serializable ,它也需要实现 Serializable .. 所以问为什么有必要为由其他自定义对象组成的类显式实现 Serializable

【问题讨论】:

  • 仍然没有必要,但我确定了一个解决方案..我为复合对象实现了它,因为没有它会导致 NotSerializableException

标签: java serialization composition


【解决方案1】:

据您所知,在 Java 中:

组合表示一个对象实例(A)的存在需要其他对象实例(A1,A2,A3),例如

public class Car {

   private Engine engine = null;
   private Body body = null;
   private List<Tyre> tyres = null;
   ...
}

如果你没有,你可以实例化 Car 对象,但它是不一致的。

序列化正在将一个对象及其依赖对象图写入流,即

FileOutputStream fileOut = new FileOutputStream("/tmp/object.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);

out.writeObject(YOUR_OBJECT_INSTANCE);

out.close();

如果您的对象没有实现java.io.Serializable,则此代码将抛出NotSerializableException,,这同样适用于其所有非静态和非瞬态数据成员,以此类推,直到关闭。使用指定的SerialVersionUID比较好,JVM不会在运行时计算。

在你的情况下:

  • 在这种情况下我是否应该使用组合?

如果您使用组合,在您的TriggerRecord 中,您必须实现组合EventDataBaseRecord 的操作的方法。

如果TriggerRecordBaseRecord 有一些共同的方法,请扩展它并使用覆盖方法。您可以避免代码重复和代码效率低下。

  • 并且正在通过网络序列化发送一个 TriggerRecord ArrayList 将作为 TriggerRecord 的所有数据成员自动实现 是可序列化的还是我需要显式实现可序列化 使用 SerialVersionUID?

和以前一样,每个班级最好有自己的SerialVersionUID

如果您添加更多详细信息,我们可以通过其他更好的方式为您提供帮助。

【讨论】:

  • 看看..添加了一些细节
  • “和以前一样,每个类最好有自己的 SerialVersionUID。当您序列化列表、地图或其他复合对象时,”.. 所以即使复合对象已经实现它,我也需要实现 Serializable。 .?
  • 是的,所有对象都必须是可序列化的,否则你可能会出现异常或错误的序列化,这会给你带来脏或错误的数据。
  • 是的..在发布问题半小时后..我只实现了合成和正确的序列化! :) .. 无论如何感谢您的回复 :)
猜你喜欢
  • 1970-01-01
  • 2017-11-02
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多