2009-08-24 19 views
18

Seri hale getirilmiş bir Java nesnesinin oluşturulan serialVersionUID değerini belirlemenin bir yolu var mı?Seri hale getirilmiş nesnenin serialVersionUID'sini bulma

Sorun şu ki, serialVersionUID açık bir şekilde belirtmeden bir nesneyi serileştirdim. Artık serileştirme süreci sınıf uyumsuzluklarından şikayet ediyor. Ancak sınıfı, onu uyumsuz hale getirecek şekilde değiştirmedim. Bu yüzden, serialVersionUID nesnesini nesne verilerinde saklandığından belirtmenin yeterli olduğunu varsayalım. Bunu yapabilmek için serileştirilmiş verilerden serialVersionUID'u okumam gerekiyor.

+0

Sınıfa bir yöntem eklendiğinde ne olur? Eski serileştirilmiş nesne modifiye seri hale getirilmiş sınıf kullanılarak okunabilir mi? – sprezzatura

+0

Yöntemler, bir nesnenin durumunu oluşturmaz, bu nedenle hiçbir serialVersionUID kullanmadığınız sürece seri hale getirilmiş nesneyi okumada sorun olmaz .. –

cevap

0

Yapmanız gereken tam olarak budur - kendi static final long serialVersionUID'u belirtin.

Serializable için dokümanlar içinde bununla ilgili bir bölüm var.

Bir serialVersionUID belirtmediyseniz, akışı, @WMR'nin önerdiği gibi şifresini çözmek dışında bir yol almanın kolay bir yolu olduğuna inanmıyorum.

bakınız bölüm 6.4 Bu kullanma http://java.sun.com/javase/6/docs/platform/serialization/spec/serialTOC.html

yılında, sen seri olarak nesnenin SerialVersionUID belirlemek mümkün olmalıdır:

+0

Bunun serialVersionUID olarak adlandırılması gerektiğini unutmayın (not: serialversionuid - Java büyük/küçük harfe duyarlıdır) ve özel statik final uzunluğunda olmalıdır). – Jesper

+0

Katılıyorum. Ancak, oluşturulan uid'i serileştirilmiş verilerden okumak için bir yol var mı? – paweloque

1

belirli nesnelerin serileştirme için gramer yoktur. Bunun yöntemi tarafından döndürülen tanımlayıcısı değiştirerek tüm tefrika veri okumak mümkün olacağını düşünüyoruz

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(); 
    } 

} 

ama hiç denemedim:

5

Diziselleştirilmiş bitlerle ilişkili meta veriler vardır (isterseniz bir başlık). Değeri, hangi konumda olduğunu biliyorsanız (SerialVersionUID burada sınıf adı gibi başka bilgilerle birlikte yazılırsa) meta verilerden okuyabilirsiniz.

Bu makalede size yardımcı olabileceğini düşünüyorum: The Java serialization algorithm revealed.

Bitlerin "açık olarak" yazıldığını unutmayın (akışı açıkça şifrelenmedikçe), böylece bir HEX editörü, SerialVersionUID'un ne olduğunu görmeniz için gereken her şey olabilir.

21

Eğer

import java.io.Serializable; 

public class TestSerializable implements Serializable { 

} 

serialversionUID- söz unutmuş olduğu sınıf var varsayalım bir sınıf-

ait serialversionUID öğrenmek için kolay bir yolu var sadece bu-

serialver -classpath . TestSerializable 
do

Bu baskılar -

static final long serialVersionUID = 5832063776451490808L; 
long serialVersionUID = ObjectStreamClass.lookup(YourObject.getClass()).getSerialVersionUID(); 

çok yardımcı olur Umut:

serialver JDK

Bu benim için çalışıyor
+2

Ancak bu, yalnızca TestSerializable sınıfının eski sürümüne sahipseniz çalışır. lewap'ın problemi, serialVersionUID değerinin serileştirdiği nesnenin sınıfının eski bir sürümüyle ne olduğunu bilmemesidir. Artık sınıfın eski versiyonuna sahip değilse, öğrenmek için serialver kullanamaz. – Jesper

+0

, sürüm denetimi bunun için. – james

13

ile birlikte gelen bir yardımcı programdır.

0

tefrika nesnenin serialVersionUID almak için çok daha basit bir yolu vardır - sadece farklı seri versiyonu uid ile aynı sınıfa apache commons seri programlarında olduğu bu serisini ve olmayacak istisna mesajını okumak fazla veya daha az:

org.apache.commons.lang.SerializationException: java.io.InvalidClassException: my.example.SerializableClass; Yerel sınıf uyumsuz: dere classdesc serialVersionUID = -1, yerel sınıf serialVersionUID = -2

Android geliştiricileri için
0

enter image description here , ayrıca Ayarlar seri muayene etkinleştirebilirsiniz

-> Editör -> Denetimler -> etkinleştirmek "SerialVersionUID" olmadan "Serializable sınıfı" kontrol et "önce", sonra ALT + ENTER, stüdyo sizin için serialVersionUID yaratacaktır.

İlgili konular