Maison Java javaDidacticiel Bases de Java - Sérialisation

Bases de Java - Sérialisation

Jul 09, 2017 pm 06:13 PM
java 基础 序列化

一、java中的序列化

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2) 在网络上传送对象的字节序列。

JDK类库中的序列化API

ObjectOutputStream //代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

ObjectInputStream  //代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

只有实现了Serializable和Externalizable接口的类的对象才能被序列化。

Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式
对象序列化包括如下步骤:

1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

2) 通过对象输出流的writeObject()方法写对象。

对象反序列化的步骤如下:

1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

2) 通过对象输入流的readObject()方法读取对象。

<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> Test3 {
            </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) <span style="color: #0000ff">throws</span><span style="color: #000000">  IOException, ClassNotFoundException {
                </span><span style="color: #008000">/*</span><span style="color: #008000">ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("c:\\1.obj"));
                
                //序列化对象
                Person p=new Person(777,"我们要好好学习");
                
                out.writeObject("我是String类型的数据");  //写入String类型
                out.writeObject(new Date()); //写入日期类型
                out.writeObject(p); //写入自定义类型
                out.writeInt(123); //定入基本数据类型
                
                out.close();</span><span style="color: #008000">*/</span>
                
                <span style="color: #008000">//</span><span style="color: #008000">反序列化对象</span>
                ObjectInputStream in=<span style="color: #0000ff">new</span> ObjectInputStream(<span style="color: #0000ff">new</span> FileInputStream("c:\\1.obj"<span style="color: #000000">));
                
                System.out.println(</span>"obj1="+<span style="color: #000000">in.readObject());  
                System.out.println(</span>"obj2="+<span style="color: #000000">in.readObject());  
                System.out.println(</span>"obj3="+<span style="color: #000000">in.readObject());  
                System.out.println(</span>"obj4="+<span style="color: #000000">in.readInt());     
                
                in.close();
            }
        }</span>
Copier après la connexion
<span style="color: #008000">//</span><span style="color: #008000">Serializable 是个空接口</span>
        <span style="color: #0000ff">class</span> Person <span style="color: #0000ff">implements</span><span style="color: #000000"> Serializable{
            </span><span style="color: #0000ff">int</span><span style="color: #000000"> age;
            String name;
            
            Person(</span><span style="color: #0000ff">int</span><span style="color: #000000"> age,String name){
                </span><span style="color: #0000ff">this</span>.age=<span style="color: #000000">age;
                </span><span style="color: #0000ff">this</span>.name=<span style="color: #000000">name;
            }
            
            </span><span style="color: #0000ff">public</span><span style="color: #000000"> String toString(){
                </span><span style="color: #0000ff">return</span> <span style="color: #0000ff">this</span>.name+":"+<span style="color: #0000ff">this</span><span style="color: #000000">.age;
            }
        }</span>
Copier après la connexion

2. Interface sérialisable et interface externalisable (ce qui suit est l'enregistrement des connaissances de base)
1.Sérialisable

ObjectOutputStream ne peut sérialiser que les objets des classes avec l'interface Serialisable.

Par défaut, ObjectOutputStream est sérialisé de la manière par défaut. Cette méthode de sérialisation sérialise uniquement les variables d'instance non transitoires (transitoires, non persistantes) de l'objet, mais ne sérialise pas les instances transitoires des variables d'objet, statiques. les variables ne seront pas sérialisées.

Lorsque ObjectOutputStream est désérialisé de la manière par défaut, il présente les caractéristiques suivantes :

1) Si la classe à laquelle appartient l'objet en mémoire n'a pas été chargée, alors cette classe sera chargée et initialisée en premier. Si le fichier de classe correspondant n'existe pas dans le chemin de classe, ClassNotFoundException sera levée

;

2) Aucune méthode constructeur de la classe ne sera appelée lors de la désérialisation.

Si l'utilisateur souhaite contrôler la façon dont la classe est sérialisée, les méthodes writeObject() et readObject() sous la forme suivante peuvent être fournies dans la classe sérialisable.

private void writeObject(java.io.ObjectOutputStream out) lève IOException

private void readObject(java.io.ObjectInputStream in) lève IOException, ClassNotFoundException;

Lorsque ObjectOutputStream sérialise un objet Person, si l'objet a une méthode writeObject(), alors cette méthode sera exécutée, sinon elle sera sérialisée par défaut. Dans la méthode writeObjectt() de l'objet, vous pouvez d'abord appeler la méthode defaultWriteObject() d'ObjectOutputStream, afin que le flux de sortie de l'objet effectue d'abord l'opération de sérialisation par défaut. La même chose peut être dite pour la désérialisation, mais cette fois la méthode defaultReadObject() est appelée.

Certains objets contiennent des informations sensibles qui ne doivent pas être divulguées au public. S'ils sont sérialisés par défaut, leurs données sérialisées peuvent être volées par des criminels lors de leur transmission sur le réseau. Pour ce type d'informations, elles peuvent être cryptées puis sérialisées. Lors de la désérialisation, elles doivent être déchiffrées et restaurées selon les informations d'origine.

La méthode de sérialisation par défaut sérialisera l'intégralité du graphe d'objet, ce qui nécessite de parcourir de manière récursive le graphe d'objet. Si le graphe d'objets est complexe, les opérations de parcours récursives consommeront beaucoup d'espace et de temps, et sa structure de données interne est une liste bidirectionnelle.

Pendant l'application, si certaines variables membres sont modifiées en type transitoire (private transient int age), cela permettra d'économiser de l'espace et du temps et d'améliorer les performances de sérialisation.

2.Externalisable

Hérite de l'interface Serialisable. Si une classe implémente l'interface Externalisable, alors cette classe contrôlera complètement son propre comportement de sérialisation. L'interface Externalisable déclare deux méthodes :

public void writeExternal (ObjectOutput out) lève IOException

public void readExternal(ObjectInput in) lance IOException, ClassNotFoundException

Le premier est responsable des opérations de sérialisation, et le second est responsable des opérations de désérialisation.

Lors de la désérialisation d'un objet d'une classe qui implémente l'interface Externalisable, /* appellera d'abord le constructeur de la classe sans paramètres, ce qui est différent de la méthode de désérialisation par défaut */

Si vous supprimez le constructeur sans paramètres de la classe, ou définissez l'autorisation d'accès du constructeur au niveau privé, par défaut ou protégé,

Lancera java.io.InvalidException : aucune exception de constructeur valide.

3.serialVersionUID

Ilcompatibilité de sérialisation des différentes versions de classes sérialisables Toute classe qui implémente l'interface Serialisable a une variable statique représentant l'identifiant de la version de sérialisation :

privé statique final long serialVersionUID ;

La valeur serialVersionUID ci-dessus est automatiquement générée par l'environnement d'exécution Java en fonction des détails internes de la classe. Si le code source d'une classe est modifié puis recompilé, la valeur de serialVersionUID du fichier de classe nouvellement généré peut également changer.

La valeur par défaut de SerialVersionUID d'une classe dépend entièrement de l'implémentation du compilateur Java. Pour la même classe, compilée avec différents compilateurs Java, cela peut donner lieu à un SerialVersionUID différent, ou cela peut être le même. Afin d'améliorer l'indépendance et la certitude de SerialVersionUID, il est fortement recommandé de définir explicitement SerialVersionUID dans une classe sérialisable et de lui donner une valeur explicite. Définir explicitement SerialVersionUID a deux utilisations :

1) Dans certains cas, on espère que différentes versions d'une classe sont compatibles avec la sérialisation, il est donc nécessaire de s'assurer que les différentes versions d'une classe ont le même serialVersionUID

2) Dans certains cas, vous ne souhaitez pas que les différentes versions d'une classe soient compatibles avec la sérialisation, vous devez donc vous assurer que les différentes versions de la classe ont des SerialVersionUID différents

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles