【问题标题】:Serializing and deserializing the object in different jvm instances在不同的jvm实例中序列化和反序列化对象
【发布时间】:2012-08-11 06:23:37
【问题描述】:

我有一个疑问,我正在 java 中进行序列化,如果我打开两个 JVM 实例,请告诉我,假设我在两个不同的位置打开了两个不同的 eclipse 工作空间,并且在一个工作空间中创建了程序序列化具有 .ser 扩展名的文件中的对象,并通过另一个工作区我创建了通过读取该 .ser 文件来反序列化对象的程序。

现在请告知该对象会在不同的 JVM 实例中反序列化吗?问题围绕着这样一个事实,即在同一个 JVM 实例中对对象进行序列化和反序列化是强制性的……!!

【问题讨论】:

  • 重要的是您要反序列化的类具有相同的代码。否则序列化不会很有用,因为当您重新启动应用程序时,您有一个不同的 JVM 实例。
  • @PeterLawrey 了不起的人,向您致敬,您能否发布代码以显示这两种情况,以便更清楚地理解
  • @user1582269 最好的学习方法是亲自尝试。当我不了解怀疑的根源时,我看不出我可以证明某事不是问题。
  • 当然它可以在不同的 JVM 之间工作。否则,这将既无用又毫无意义。当你尝试它时发生了什么?
  • @EJP 所以你的意思是说它可以在不同的JVM实例中工作..!!

标签: java serialization


【解决方案1】:

序列化是一个过程,我们可以通过它将对象的状态存储到任何存储介质中。我们可以将对象的状态存储到文件、数据库表等中。反序列化是序列化的相反过程,我们从存储介质中检索对象。

Eg1:假设您有一个 Java bean 对象并且它的变量有一些值。现在您想将此对象存储到文件或数据库表中。这可以使用序列化来实现。现在,您可以在需要时随时从文件或数据库中再次检索该对象。这可以通过反序列化来实现。

**Serialization Example:**

Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";

          e.SSN = 11122333;
          e.number = 101;
          try
          {
             FileOutputStream fileOut =
             new FileOutputStream("employee.ser");
             ObjectOutputStream out =
                                new ObjectOutputStream(fileOut);
             out.writeObject(e);
             out.close();
              fileOut.close();
          }catch(IOException i)
          {
              i.printStackTrace();
          }

**Deserializing an Object:**
The following DeserializeDemo program deserializes the Employee object created in the SerializeDemo program. Study the program and try to determine its output:



Employee e = null;
         try
         {
            FileInputStream fileIn =
                          new FileInputStream("employee.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            e = (Employee) in.readObject();
            in.close();
            fileIn.close();
        }catch(IOException i)
        {
            i.printStackTrace();
            return;
        }catch(ClassNotFoundException c)
        {
            System.out.println(.Employee class not found.);
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized Employee...");
        System.out.println("Name: " + e.name);
        System.out.println("Address: " + e.address);
        System.out.println("SSN: " + e.SSN);
        System.out.println("Number: " + e.number);

【讨论】:

  • ..cool man,但是如果序列化发生在一个实例中而反序列化是在另一个 JVM 实例中完成的......!!
  • @EJP 我已经读到它不会工作,这是我的 qyery 也可以工作..?
  • -1;您正在从 link 获取文本,而没有在任何地方引用它。如果您引用文字,请明确说明!
【解决方案2】:

Java serialization format is standardized。任何 JVM 都可以读写。

字节流可能略有不同(例如,序列化程序可能会以不同的顺序写入某些对象;如果您在一个类中有两个 int 字段,则它们的写入顺序无关紧要)。

但反序列化的结果将始终相同,除非您更改了存储在字节流中的类的 Java 代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2020-10-19
    • 2014-07-10
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多