Java 对象序列化查询

Java 对象序列化查询,java,serialization,Java,Serialization,我目前正在学习Java中的对象序列化,据我所知,甚至可以序列化实现可序列化接口的对象,并通过套接字将其传递给其他程序 class Mammal implements Serializable { int legs = 4; } public class ObjectSerial { public static void main(String[] args) { try { FileOutputStre

我目前正在学习Java中的对象序列化,据我所知,甚至可以序列化实现可序列化接口的对象,并通过套接字将其传递给其他程序

  class Mammal implements Serializable
{
    int legs = 4;

}

public class ObjectSerial
{



    public static void main(String[] args)
    {
        try
        {
            FileOutputStream fo = new FileOutputStream("mammal.obj");
            ObjectOutputStream oo = new ObjectOutputStream(fo);

            Mammal m = new Mammal();
            oo.writeObject(m);
            oo.close();
        }
        catch(IOException e){}

        //read object
        try
        {
            FileInputStream fi  = new FileInputStream("mammal.obj");
            ObjectInputStream oo = new ObjectInputStream(fi);

            Mammal m = (Mammal)oo.readObject();
            System.out.println(m.legs);
        }
        catch(IOException e){}
        catch(ClassNotFoundException cnf){}//this exception must also be caught
    }
}
让我困惑的是,当我想在服务器端检索类成员时,例如,我将如何“到达”;序列化的对象

try
    {
        FileInputStream fi  = new FileInputStream("mammal.obj");
        ObjectInputStream oo = new ObjectInputStream(fi);

        Mammal m = (Mammal)oo.readObject();
        System.out.println(m.legs);
    }
    catch(IOException e){}
    catch(ClassNotFoundException cnf){}//t
换句话说。在另一个程序中,编译器会告诉我找不到符号

希望这个问题听起来不是很无知。 只是确认一下……我如何在不同的程序中访问Serializedobject的变量


关于

当您在服务器上反序列化您的哺乳动物.obj时,您需要在类路径上有哺乳动物.class。哺乳动物所依赖的任何对象也依赖于类路径。这是唯一的方法,也是序列化的缺点。它以二进制方式将客户机和服务器连接起来。

当您在服务器上反序列化您的Mayman.obj时,您需要在类路径上有Mayman.class。哺乳动物所依赖的任何对象也依赖于类路径。这是唯一的方法,也是序列化的缺点。它以二进制方式将您的客户机和服务器连接起来。

希望此网站能对您有所帮助:


我不能将其强制转换为原始对象,这有点错误,但您需要使用readObject方法来重新创建对象,实现序列化应该会迫使您在您的Mamula对象上执行此操作。

希望此站点能对您有所帮助:


我在无法将其强制转换为原始对象方面有点错误,但您需要使用readObject方法来重新创建对象,实现序列化应该会迫使您在Mamula对象上执行此操作。

此外,不要忘了添加以下内容:

// Better to let the compiler generate this at first
private static final long serialVersionUID = -1111111L;
并确保每次更改对象中的数据定义(即添加/删除/修改非瞬态字段定义)时都会更改它

写入序列化对象时,serialVersionUID是写入内容的一部分。当它被读回时,它获取该serialVersionUID并将其与类加载器中该类的serialVersionUID进行比较


如果两者不匹配,则表示序列化对象是从与当前加载的类不同的版本生成的,将引发异常。

此外,不要忘记添加以下内容:

// Better to let the compiler generate this at first
private static final long serialVersionUID = -1111111L;
并确保每次更改对象中的数据定义(即添加/删除/修改非瞬态字段定义)时都会更改它

写入序列化对象时,serialVersionUID是写入内容的一部分。当它被读回时,它获取该serialVersionUID并将其与类加载器中该类的serialVersionUID进行比较

如果两者不匹配,则表示序列化对象是从与当前加载的类不同的版本生成的,并且将引发异常