在java中,当处理序列化和来自另一个可实例化类的引用时,引用用户定义类是如何工作的?

在java中,当处理序列化和来自另一个可实例化类的引用时,引用用户定义类是如何工作的?,java,serialization,reference,Java,Serialization,Reference,我有一个可序列化的类,比如class“WriteMe”。此类需要另一个类来更新其成员之一。所述类相对较大,因为WriteMe主要只是一个包装类。我们将大类称为“MegaClass”。所以我们有这样的东西: public class WriteMe implements Serializable { private ArrayList<String> list; private String name; public WriteMe(String s)

我有一个可序列化的类,比如class“
WriteMe
”。此类需要另一个类来更新其成员之一。所述类相对较大,因为
WriteMe
主要只是一个包装类。我们将大类称为“
MegaClass
”。所以我们有这样的东西:

public class WriteMe implements Serializable
{
    private ArrayList<String> list;
    private String name;

    public WriteMe(String s)
    {
        name = s;
    }

    public void update(MegaClass m)
    {
        list = m.getList(name);
    }
}
公共类WriteMe实现可序列化
{
私有数组列表;
私有字符串名称;
公共WriteMe(字符串s)
{
name=s;
}
公共无效更新(MegaClass m)
{
list=m.getList(名称);
}
}
这样做的希望在于,我不想像
ArrayList
String
那样将
MegaClass
存储为类变量。我希望通过将它传递给一个方法,并且只在需要它的地方使用它,我将减少创建
WriteMe
时使用的内存量,并且如果我要将它传递给
ObjectOutputStream
或类似的对象,我还可以减少
WriteMe
对象的文件大小(以便可以将其写入文件)


Megaclass m
”只要存储一个指向该对象实例化的指针就行了?如果是的话,我可以想象,我是否将其作为类变量并不重要,因为一个地址只有几个字节左右。如上所示,仅使用传递到方法中的对象有什么好处吗?另一种方法是将其传递到构造函数中并作为类变量赋值可行。两种方法都有利吗?

正如Mark W.所建议的,最好的办法是将“MegaClass”和“WriteMe”的使用分开,这样WriteMe所需要的只是数据

public void update(ArrayList<String> newList)
{
    list = newList;
}
public void更新(ArrayList newList)
{
列表=新列表;
}

通过这种方式,引用两个类的超类可以从MegaClass查询“什么是正确的数据?”,并将此信息传递给WriteMe!这样做的好处是,不需要临时数据,也不需要对MegaClass的任何引用!

如果MegaClass类型的类中有一个字段标记为临时字段,则在序列化时它不会与类的其余部分保持在一起,从磁盘加载时它将为null。您可以这是为了在运行时维护引用,并在反序列化对象后重新分配字段变量。首先,我不能将WriteMe中的类变量标记为transient吗?例如:“private transient MegaClass megaReference;”第二,这有关系吗?如果它只是一个引用,即:内存中的一个地址,它不是只需要文件中的几个字节吗?一个地址只是一个十六进制值,一个数字。对不起,我误读了你说的。第二个但问题仍然存在。它不只是某种形式的整数,指的是内存中的一个点吗?当对象被序列化时,它会将任何可序列化的非瞬态数据与其字段关联到磁盘。当对象被反序列化时,无法保证同一类型的对象将位于内存中的同一位置很明显,它需要的不仅仅是一个内存地址。如果你说的是运行时的大小,它不会复制MegaClass对象,除非它在自己的线程上。当然。这是有意义的。谢谢!最后一件事。按照我在问题中所写的方式来做有什么好处吗?或者最好是使用瞬态类变量waY