序列化和组合

时间:2014-01-12 03:32:49

标签: java serialization composition

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

我需要另一个数据库触发器排序功能,它有自己的数据成员=触发器激活事件数据=>当满意时会插入一个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的所有数据成员都是Serializable,或者我是否需要使用SerialVersionUID显式实现Serializable?

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

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

1 个答案:

答案 0 :(得分:0)

据您所知,在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的所有数据成员   是Serializable还是我需要显式实现Serializable   使用SerialVersionUID?
  •   

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

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