Announcement

Collapse
No announcement yet.

serialVersionUID Abfrage verhindern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • serialVersionUID Abfrage verhindern

    Hi,
    ich hab ein bisschen ein Problem mit dem Import von serialisierten Objekten.
    Ich hab ein Objekt in ner txt und ne dazugehörige Klasse. Jetzt ham die aber verschieden serialVersionUID. Es kann auch sein das ich mehrere verschiedene serialisierte Objekte habe (von der gleichen Klasse) die alle unterschiedliche UIDs haben. Nun meine Frage:
    Kann man die Abfrage nach der UID verhinder? Sprich beim Import kommt nicht mehr die Exception dass ich das Objekt nicht importieren kann.
    Muss ich dafür eventuell ne eigenen ObjectInputStream schreiben. Wenn ja gibts den Quelltext zum Java interenten ObjectInputStream denn irgendwo? Weil da müsste ja die Abfrage der UID drinstehen.
    Danke für eure Hilfe!!!

  • #2
    Kann man die Abfrage nach der UID verhinder? Sprich beim Import kommt nicht mehr die Exception dass ich das Objekt nicht importieren kann.
    Es ist der Sinn, dass nur Objecte importiert werden können, die auch mit dieser Klasse erstellt wurden. Schließlich könnten sich Methoden usw. geändert haben.

    Wenn ja gibts den Quelltext zum Java interenten ObjectInputStream denn irgendwo?
    Der Quelltext steht auf den Downloadseiten von Java bereit. Was sollte er dir nützen? Willst du die komplette Javaumgebung dann neu compilieren und bei dir installieren?

    Warum speicherst du nicht mit JAXB?
    Zuletzt editiert von Christian Marquardt; 02.10.2010, 17:25.
    Christian

    Comment


    • #3
      Hi,
      natürlich macht eine UID Sinn und im Nachhinein würde ich auch entweder immer eine eigene sofort vergeben (1L) oder ganz auf serialisierte Objekte verzichten ,aber das ist einfach jetzt nicht mehr möglich.

      Wenn ich den Quellcode des ObjectInputStreams hätte könnt ich mir doch ne eigene Klasse, die von ObjectInputStream ableitet, erstellen und die betreffenden Methoden bzw. Zeilen Code die sich auf die UID beziehen überschreiben.
      EDIT:
      ich war jetzt mal auf der Java.com Seite. Unter downloads gibts nur die jre. Weißt du wo der Quellcode zu finden ist?
      Danke...

      Comment


      • #4
        http://www.oracle.com/technetwork/ja...ads/index.html


        Wenn ich den Quellcode des ObjectInputStreams hätte könnt ich mir doch ne eigene Klasse, die von ObjectInputStream ableitet, erstellen und die betreffenden Methoden bzw. Zeilen Code die sich auf die UID beziehen überschreiben.
        Dann viel Spass....empfinde ich allerdings als "Programmierung gegen das Framework"...
        Christian

        Comment


        • #5
          Danke für den Link.
          Natürlich ist das von Sun nicht so gedacht gewesen aber dafür sind ja die Source Codes wohl online. Damit man Klassen so ändern kann wie man es braucht.

          Comment


          • #6
            Natürlich ist das von Sun nicht so gedacht gewesen aber dafür sind ja die Source Codes wohl online. Damit man Klassen so ändern kann wie man es braucht.
            Denke die sind - unabhängig von der Lizenz - verfügbar, damit man schauen kann, wie das realisiert wurde, debuggen kann.

            Eine eigene Implementierung nützt nix...wer hat diese und wer würde diese installieren?
            Christian

            Comment


            • #7
              readFields()

              Hallo affenmensch3,

              wenn es Dir nur um die Werte in den serialisierten Objekten geht, probier mal die Methode ObjectInputStream.readFields() aus. Die erzeugt ein GetField-Objekt, mit dem Du über die Feldnamen auf die Werte zugreifen kannst. Vielleicht rufst Du lieber diese Methode auf, anstatt defaultReadObject(). Im Quellcode habe ich nicht entdecken können, dass diese Methode die serialVersionUid überprüft. Aber ausprobiert habe ich es nicht.

              Gruß ngomo
              http://www.winfonet.eu

              Comment


              • #8
                Originally posted by Christian Marquardt View Post
                Eine eigene Implementierung nützt nix...wer hat diese und wer würde diese installieren?
                Ich brauch die Implementierung doch nur für mein Projekt. Ich erstell ne Klasse und leite von ObjectInputStream ab. Dann überschreibe ich die richtige Methode. Mach Copy/Paste aus der orginalen Klasse des JDKs nur das ich eben die Abfrage der UID verhindere bzw. rauslösche. So hab ich es mir mal grob vorgestellt.

                Originally posted by ngomo View Post
                Hallo affenmensch3,

                wenn es Dir nur um die Werte in den serialisierten Objekten geht, probier mal die Methode ObjectInputStream.readFields() aus. Die erzeugt ein GetField-Objekt, mit dem Du über die Feldnamen auf die Werte zugreifen kannst. Vielleicht rufst Du lieber diese Methode auf, anstatt defaultReadObject(). Im Quellcode habe ich nicht entdecken können, dass diese Methode die serialVersionUid überprüft. Aber ausprobiert habe ich es nicht.

                Gruß ngomo
                Danke, ich werd es mal ausprobieren...

                Comment


                • #9
                  Ich hab jetzt eine ganz gute Lösung gefunden.
                  Hab vom ObjectInputStream abgeleitet und eine Methode überschrieben.
                  Schon funktioniert der Import einwandfrei.
                  Danke für all eure Hilfe.

                  Comment


                  • #10
                    Code posten

                    Hi affenmensch,
                    wenn's Dir nix ausmacht, poste mal den Code. So einen Multi-Purpose Deserialisierer kann man ja vielleicht auch mal gebrauchen.
                    Gruß ngomo
                    http://www.winfonet.eu

                    Comment


                    • #11
                      Hier der Code (nicht von mir!!)

                      Code:
                      public class InputStreamOwn extends ObjectInputStream{
                      
                          public InputStreamOwn(InputStream in) throws IOException {
                              super(in);
                          }
                      
                      	 protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
                      	        ObjectStreamClass resultClassDescriptor = super.readClassDescriptor(); // initially streams descriptor
                      	        @SuppressWarnings("rawtypes")
                      			Class localClass = Class.forName(resultClassDescriptor.getName()); // the class in the local JVM that this descriptor represents.
                      	        if (localClass == null) {
                      	            System.out.println("No local class for " + resultClassDescriptor.getName());
                      	            return resultClassDescriptor;
                      	        }
                      	        ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass);
                      	        if (localClassDescriptor != null) { // only if class implements serializable
                      	            final long localSUID = localClassDescriptor.getSerialVersionUID();
                      	            final long streamSUID = resultClassDescriptor.getSerialVersionUID();
                      	            if (streamSUID != localSUID) { // check for serialVersionUID mismatch.
                      	                final StringBuffer s = new StringBuffer("Overriding serialized class version mismatch: ");
                      	                s.append("local serialVersionUID = ").append(localSUID);
                      	                s.append(" stream serialVersionUID = ").append(streamSUID);
                      	                Exception e = new InvalidClassException(s.toString());
                      	                System.out.println("Potentially Fatal Deserialization Operation. " + e);
                      	                resultClassDescriptor = localClassDescriptor; // Use local class descriptor for deserialization
                      	            }
                      	        }
                      	        return resultClassDescriptor;
                      	    }
                      
                      }

                      Comment

                      Working...
                      X