JavaRush /Java Blog /Random-TL /Bilang tugon sa artikulong "Bakit gumamit ng SerialVersio...
Сергей
Antas
Киев

Bilang tugon sa artikulong "Bakit gumamit ng SerialVersionUID sa loob ng Serializable na klase sa Java"

Nai-publish sa grupo
Kaya.. Mayroon kaming isang klase na gusto naming i-serialize gamit ang mga conventional na pamamaraan (ginagamit namin Serializable) Bilang tugon sa artikulong "Bakit gumamit ng SerialVersionUID sa loob ng Serializable na klase sa Java" - 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
Nagsusulat kami ng isang aplikasyon sa pagsusulit. Sasabihin ko kaagad na ang layunin ko ay ipakita kung ano serialVersionUID.
package Serialization;

import java.io.*;

public class MainSerializable {
    final static String FILE_NAME = "c:\\File.dat";

    public static void serialize(Object object) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(object);

        fileOutputStream.close();
        objectOutputStream.close();
    }

    public static Object deserialize() throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream(FILE_NAME);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        Object object = objectInputStream.readObject();

        objectInputStream.close();

        return object;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        SerializableClass serializableClass = new SerializableClass();

        serialize(serializableClass);

        SerializableClass newObject = (SerializableClass) deserialize();
    }
}
Lahat ay gumagana nang mahusay. Ang klase ay serialized sa isang file FILE_NAME = "c:\\File.dat". Dumidilim na... :) Nakalimutang magdagdag ng mga field sa klase. Idagdag:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
Mukhang maayos ang lahat.. lahat ay pinagsama-sama.. Kaya't pinapatakbo namin ito main, i-deserialize ang klase SerializableClassmula sa file na " c:\\File.dat":
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
Oh... Anong gagawin...
Exception in thread "main" java.io.InvalidClassException: Serialization.SerializableClass; local class incompatible: stream classdesc serialVersionUID = 8129437039424566964, local class serialVersionUID = -8271479231760195917
	at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689)
	at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1903)
	at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
	at Serialization.MainSerializable.deserialize(MainSerializable.java:22)
	at Serialization.MainSerializable.main(MainSerializable.java:30)
Sa pangkalahatan, ang lahat ay patas. Ang klase ay nagbago at ang serialVersionUID= -8271479231760195917, at serialized sa file serialVersionUID= 8129437039424566964. Ano ang gagawin ngayon, ano ang gagawin? Paano gumawa ng isang instance? May labasan. Kailangan nating ideklara sa ating klase: static final long serialVersionUID, na katumbas ng serialVersionUIDkulay abong :) klase sa file. Yung. sabi namin, sige, ide-deserialize ko.. pwede.. pare-pareho ang mga version mo:
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    static final long serialVersionUID = 8129437039424566964L;

    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
}
Inilunsad namin... At.. Gumagana ang lahat. Gaya ng pagkakaintindi ko, naiwasan sana ang error na ito kung ipinahayag ng klase nang maaga:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
Yung. hindi namin hinahayaan ang Java na gumawa ng sarili nitong mga kalkulasyon serialVersionUIDbatay sa mga algorithm nito (medyo kumplikadong mga algorithm). Ngayon, sa tuwing nagbabago ang isang klase, serialVersionUID = 1L sinusuri namin:
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
Gumagana ito.. At ngayon ay ganito:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
Oo.. At gayon?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
Cool.. lahat ay patuloy na gumagana. Kaya natapos ko ang aking unang artikulo. Nais kong ilagay ang lahat ng ito sa mga komento, ngunit hindi ako makalusot sa mga simbolo. Tatanggapin ko ang matino na pagpuna at komento PS Salamat sa may-akda na nagbigay inspirasyon sa akin upang gawin ang mga delights na ito.. Malamang, ito ay kung paano sila matuto :) Good luck sa lahat :)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION