在Java中仅反序列化必填字段

在Java中仅反序列化必填字段,java,serialization,deserialization,Java,Serialization,Deserialization,要序列化的测试类如下所示: public Class Test implements Serializable { private static final long serialVersionUID = GENERATED_LONG_VALUE; private int val; private SomeClass_1 val_1; private SomeClass_2 val_2; private SomeClass_3 val

要序列化的测试类如下所示:

 public Class Test implements Serializable {
      private static final long serialVersionUID = GENERATED_LONG_VALUE;
      private int val;
      private SomeClass_1 val_1;
      private SomeClass_2 val_2;
      private SomeClass_3 val_3;
      // getter and setter for above
  }
我已将上述类的对象序列化为表中的BLOB

现在反序列化时,我只需要
val
val_1
。 所以我在测试类中重写了readObject()方法,如下所示

    private void readObject(java.io.ObjectInputStream stream)
        throws IOException, ClassNotFoundException {

        this.val = (int) stream.readObject();
        this.val_1 = (SomeClass_1) stream.readObject();
    }
但在此之后,它也在为
val_3
val_4
执行
stream.readObject()。即使我没有阅读
stream.readObject()
中的
val_3
val_4
,我也不明白为什么会发生这种情况


p.S.我在
服务器X
上进行序列化,同时在
服务器Y
上对其进行反序列化,并且类结构在
服务器Y
上完全相同,就像
服务器X

如果一台服务器X要求将对象的所有成员传递给它,但服务器Y没有,您可能希望:

  • 调查。这使您能够完全控制编组和解编组,这似乎是您所需要的

  • 发送不同的服务器:一个序列化所有字段,另一个不序列化。您可以为要发送到服务器的数据创建一个代理,并传入要发送的对象。一个代理使用瞬态
  • ,另一个不使用

  • 不要发送对象,而不要发送重建另一侧对象所需的数据。如果要发送的对象不需要太多数据,这可以减轻网络上的压力


  • 声明您不希望序列化的变量,因为我也尝试过这种方法,但它不起作用。@VinceEmigh:序列化时我使用了所有字段,而反序列化时我只希望恢复前两个字段。不是其他领域。但它仍然用于处理其他字段。不要序列化所有字段。如果你不打算反序列化它们,那么序列化它们是没有意义的。@VinceEmigh:我需要在
    服务器x
    上使用它们。但是在
    服务器Y
    ,我不需要它们。这就是为什么我需要用所有字段序列化对象。我可以用java.io.Serializable进行序列化,用java.io.Externalizable进行反序列化吗?因为我无法删除数据库中已经序列化的数据,我希望它回到
    服务器Y
    @Dhairyashil,所以我从未尝试过,但我觉得这会导致问题,因为
    Serializable
    使用特定的算法来整理数据,如果连接两侧不遵循相同的系统,可能会导致泄漏。这是一个假设,我自己还没有尝试过,也找不到任何关于这个主题的文章或文档。可能会有安全措施来防止出现问题,但从我的角度来看,找到问题的唯一方法是尝试并监控网络(如果没有发生逻辑问题)。@Dhairyahil根据您当前管理的序列化数据量,您可以随时将其读回,然后使用外部化来管理它,以确保您的系统是一致的。如果这是一个太多的问题,请随意选择我提供的第二个选项,这是一个工作,我觉得应该有助于你的情况。