我可以使用序列化来实现这一目标吗?

时间:2015-12-16 04:32:46

标签: java

我有一个名为Database的类,它被定义并在其中包含一些数据。

现在,我将该类的对象创建为

Database d1 = new Database();

现在,我对d1的那些数据值进行了更改,这样每当我创建数据库的另一个对象时,数据库d2',此对象都具有更新的数据值。这意味着,我们需要能够使用该类的对象来更改类定义。

这可以实现吗?

2 个答案:

答案 0 :(得分:2)

我想你可能想在你的java代码中实现copy constructor,你可以这样做:

class Database{

    Filed field; // some field

    Database(){
    }

    Database(Database db){  // copy constructor
        this.field  = db.field.clone();
    }
}

Database d2 = new Database(d1)

然后d2将所有文件更新为d1。

答案 1 :(得分:0)

  

“这意味着,我们需要能够使用该类的对象来更改类定义。”

真的?您不要通过更改类定义来更改类实例的字段中的值。类定义是......源代码/编译的字节码。

但是如果你改变了类的定义,你就会发现该类的新版本无法反序列化使用旧版本的类序列化的实例。 (细节取决于变化的确切性质......)

更一般地说,Java序列化不是数据库的好选择:

  • 很慢,
  • 它不是增量的(如果您正在加载/保存整个数据库)
  • 它不会扩展(如果要将整个数据库加载到内存中)
  • 它不支持查询(除非您将整个数据库加载到内存中并以普通Java实现查询),并且
  • 如果你需要改变“架构”,你会遇到很多问题;即您正在序列化/反序列化的类。

但是以这些限制为模,它会起作用;即它是“可实现的”。

如果您真的在谈论如何更改内存中Database对象的状态,或者如何从现有对象创建新副本,那么:

  • Database
  • 中实现/使用getter,setter和/或其他方法
  • 实现复制构造函数,工厂方法或clone方法,将Database对象状态...复制到您需要的任何深度。

所有非常容易实现的(简单的“Java 101”级别编程),虽然不一定是个好主意。