代码之家  ›  专栏  ›  技术社区  ›  paweloque

正在查找序列化对象的serialversionID

  •  19
  • paweloque  · 技术社区  · 17 年前

    是否有方法确定生成的 serialVersionUID 一个序列化的Java对象?

    问题是我序列化了一个对象而没有明确指定 序列号 . 现在反序列化过程抱怨类不兼容。不过,我并没有以一种不兼容的方式更改类。因此,我假设这足以说明 序列号 在类中,因为它存储在对象数据中。为了做到这一点,我需要阅读 序列号 来自序列化数据。

    9 回复  |  直到 8 年前
        1
  •  12
  •   McDowell rahul gupta    17 年前

    您可以通过扩展 ObjectInputStream :

    public class PrintUIDs extends ObjectInputStream {
    
      public PrintUIDs(InputStream in) throws IOException {
        super(in);
      }
    
      @Override
      protected ObjectStreamClass readClassDescriptor() throws IOException,
          ClassNotFoundException {
        ObjectStreamClass descriptor = super.readClassDescriptor();
        System.out.println("name=" + descriptor.getName());
        System.out.println("serialVersionUID=" + descriptor.getSerialVersionUID());
        return descriptor;
      }
    
      public static void main(String[] args) throws IOException,
          ClassNotFoundException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        List<Object> list = Arrays.asList((Object) new Date(), UUID.randomUUID());
        oos.writeObject(list);
        oos.close();
        InputStream in = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new PrintUIDs(in);
        ois.readObject();
      }
    
    }
    

    我相信可以通过替换方法返回的描述符来读取所有序列化数据,但我没有尝试过。

        2
  •  22
  •   Keshav    17 年前

    有一个简单的方法可以找出一个类的序列号-

    假设你在课堂上忘了提到serialversionuid-

    import java.io.Serializable;
    
    public class TestSerializable implements Serializable {
    
    }
    

    只是这样做

    serialver -classpath . TestSerializable
    

    这张照片

    static final long serialVersionUID = 5832063776451490808L;
    

    serialver是一个与JDK一起提供的实用程序

        3
  •  19
  •   Martins    11 年前

    这对我很有用:

    long serialVersionUID = ObjectStreamClass.lookup(YourObject.getClass()).getSerialVersionUID();
    

    希望它也能帮助你。

        4
  •  5
  •   user159088    17 年前

    有与序列化位关联的元数据(如果愿意,可以是头)。如果知道该值在哪个位置,则可以从元数据中读取该值 SerialVersionUID 与类名等其他信息一起写入。

    我认为这篇文章可以帮助您: The Java serialization algorithm revealed .

    请注意,这些位是“清晰地”写入的(除非您显式地加密了流),所以您可能只需要十六进制编辑器就可以看到 序列号 .

        5
  •  1
  •   WMR    17 年前

    对象序列化有指定的语法:

    见第6.4章 http://java.sun.com/javase/6/docs/platform/serialization/spec/serialTOC.html

    使用这个,您应该能够确定序列化对象的serialversionID。

        6
  •  0
  •   Nick Holt    17 年前

    这正是你应该做的-指定你自己的 static final long serialVersionUID .

    在文档中有一个关于它的部分 Serializable .

    除非你指定了 serialVersionUID 我认为除了按照@wmr的建议破译流之外,没有一种简单的方法可以得到它。

        7
  •  0
  •   psychollek    10 年前

    获取序列化对象的serialversionID的方法要简单得多-只需使用apache commons serialization utils将其反序列化到具有不同序列版本uid的同一类,并读取或多或少的异常消息:

    org.apache.commons.lang.serializationException:java.io.invalidClassException:my.example.serialibleClass;本地类不兼容:stream classdesc serialversionuid=-1,本地类serialversionuid=-2

        8
  •  0
  •   shanwu    8 年前

    enter image description here 对于Android开发者,

    您还可以从设置中启用序列化检查->编辑器->检查->启用“不带'serialversionuid'检查的可序列化类”,然后按Alt+Enter,工作室将为您创建serialversionuid。

        9
  •  0
  •   FindOut_Quran    8 年前

    获取它的最简单方法(尤其是在难以找到的情况下)是为serialversionID定义任何数字,并在反序列化失败时监视stacktrace,它将打印出原始的数字。

    推荐文章