Maison  >  Article  >  Java  >  Introduction détaillée à la sérialisation XML et à la désérialisation des objets Java

Introduction détaillée à la sérialisation XML et à la désérialisation des objets Java

黄舟
黄舟original
2017-10-20 09:36:522586parcourir

Cet article présente principalement l'exemple d'analyse de sérialisation et de désérialisation XML d'objets Java. L'éditeur pense que c'est assez bon, je vais donc le partager avec vous ici.

Dans l'article précédent, nous avons présenté des exemples de code de divers algorithmes de tri implémentés en Java. Dans cet article, nous examinons le contenu pertinent de la sérialisation XML et de la désérialisation des objets Java, comme suit.

XML est une spécification standard d'échange de données qui peut être facilement utilisée pour échanger différents types de données entre applications. Si un certain mappage peut être établi entre les objets Java et les documents XML, comme la sérialisation XML et la désérialisation des objets Java, alors les objets Java peuvent être facilement échangés avec d'autres applications.

Il existe deux classes XMLEncoder et Decoder dans le package java.beans, qui sont utilisées pour sérialiser et désérialiser les objets Java conformes à la spécification JabaBeans en XML. Le code suivant montre comment implémenter le codage et le décodage XML d'objets Java à l'aide de ces deux classes.

Classe Java à sérialiser :


import java.io.Serializable;
public class SerialableObject implements Serializable 
{
	private static final long serialVersionUID = 8745578444312339136L;
	public SerialableObject() 
	  {
	}
	public SerialableObject(int id, String name, double value) 
	  {
		this.id = id;
		this.name = name;
		this.value = value;
	}
	public int getId() 
	  {
		return id;
	}
	public void setId(int id) 
	  {
		this.id = id;
	}
	public String getName() 
	  {
		return name;
	}
	public void setName(String name) 
	  {
		this.name = name;
	}
	public double getValue() 
	  {
		return value;
	}
	public void setValue(double value) 
	  {
		this.value = value;
	}
	private int id;
	private String name;
	private double value;
}

Classe de démonstration d'utilisation de la sérialisation et de la désérialisation XML :


import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Vector;
public class XmlSerialize 
{
	public XmlSerialize() 
	  {
	}
	public void serializeSingleObject(OutputStream os, Object obj)    // 序列化单个java对象 
	{
		// XMLEncoder xe = new XMLEncoder(os); 
		XMLEncoder xe = new XMLEncoder(os, "GBK", true, 0);
		// 仅用于Java SE 7 
		xe.writeObject(obj);
		// 序列化成XML字符串 
		xe.close();
	}
	public Object deserializeSingleObject(InputStream is)    // 反序列化单个Java对象 
	{
		XMLDecoder xd = new XMLDecoder(is);
		Object obj = xd.readObject();
		// 从XML序列中解码为Java对象 
		xd.close();
		return obj;
	}
	public void serializeMultipleObject(OutputStream os, List<Object> objs)    // 序列化多个Java对象 
	{
		XMLEncoder xe = new XMLEncoder(os);
		xe.writeObject(objs);
		// 序列化成XML字符串 
		xe.close();
	}
	public List<Object> deserializeMultipleObject(InputStream is)    // 反序列化多个Java对象 
	{
		XMLDecoder xd = new XMLDecoder(is);
		@SuppressWarnings("unchecked") 
		   List<Object> objs = (List<Object>)xd.readObject();
		// 从XML序列中解码为Java对象列表 
		xd.close();
		return objs;
	}
	public void runSingleObject() 
	  {
		File xmlFile = new File("object.xml");
		SerialableObject jo4Out = new SerialableObject(1, "Java序列化为XML", 3.14159265359);
		// 创建待序列化的对象 
		try 
		   {
			FileOutputStream ofs = new FileOutputStream(xmlFile);
			// 创建文件输出流对象 
			serializeSingleObject(ofs, jo4Out);
			ofs.close();
		}
		catch (FileNotFoundException e) 
		   {
			e.printStackTrace();
		}
		catch (IOException e) 
		   {
			e.printStackTrace();
		}
		try 
		   {
			FileInputStream ifs = new FileInputStream(xmlFile);
			SerialableObject jo4In = (SerialableObject)deserializeSingleObject(ifs);
			System.out.println("id: " + jo4In.getId());
			System.out.println("name: " + jo4In.getName());
			System.out.println("value: " + jo4In.getValue());
		}
		catch (FileNotFoundException e) 
		   {
			e.printStackTrace();
		}
	}
	public void runMultipleObject() 
	  {
		File xmlFile = new File("objects.xml");
		List<SerialableObject> sos4Out = new Vector<SerialableObject>();
		sos4Out.add(new SerialableObject(1, "Java序列化为XML - 1", 3.14));
		// 创建待序列化的对象 
		sos4Out.add(new SerialableObject(2, "Java序列化为XML - 2", 3.14159));
		// 创建待序列化的对象 
		sos4Out.add(new SerialableObject(3, "Java序列化为XML - 3", 3.1415926));
		// 创建待序列化的对象 
		sos4Out.add(new SerialableObject(4, "Java序列化为XML - 4", 3.141592653));
		// 创建待序列化的对象 
		sos4Out.add(new SerialableObject(5, "Java序列化为XML - 5", 3.14159265359));
		// 创建待序列化的对象 
		try 
		   {
			FileOutputStream ofs = new FileOutputStream(xmlFile);
			// 创建文件输出流对象 
			serializeSingleObject(ofs, sos4Out);
			ofs.close();
		}
		catch (FileNotFoundException e) 
		   {
			e.printStackTrace();
		}
		catch (IOException e) 
		   {
			e.printStackTrace();
		}
		try 
		   {
			FileInputStream ifs = new FileInputStream(xmlFile);
			@SuppressWarnings("unchecked") 
			     List<SerialableObject> sos4In = (List<SerialableObject>)deserializeSingleObject(ifs);
			for (SerialableObject jo4In : sos4In) 
			     {
				System.out.println("id: " + jo4In.getId());
				System.out.println("name: " + jo4In.getName());
				System.out.println("value: " + jo4In.getValue());
			}
		}
		catch (FileNotFoundException e) 
		   {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) 
	  {
		XmlSerialize xs = new XmlSerialize();
		xs.runSingleObject();
		xs.runMultipleObject();
	}
}

Il est à noter que la classe à sérialiser doit être conforme à la spécification du format JavaBeans, c'est-à-dire : elle a un constructeur public sans paramètres, et toutes les données membres sont accessible en mode getter/setter. De plus, cette classe doit être publique et implémenter l'interface java.io.Seriallessly.

Une fois le programme exécuté, deux fichiers seront générés :

object.xml est généré par la méthode runSingleObject et stocke la valeur de un seul SerialableObject :


<?xml version="1.0" encoding="GBK"?> 
<java version="1.7.0" class="java.beans.XMLDecoder"> 
 <object class="SerialableObject"> 
 <void property="id"> 
  <int>1</int> 
 </void> 
 <void property="name"> 
  <string>Java序列化为XML</string> 
 </void> 
 <void property="value"> 
  <double>3.14159265359</double> 
 </void> 
 </object> 
</java>

objects.xml est généré par la méthode runMultipleObject et stocke les valeurs de 5 SeriallesslyObjects :


<?xml version="1.0" encoding="GBK"?> 
<java version="1.7.0" class="java.beans.XMLDecoder"> 
 <object class="java.util.Vector"> 
 <void method="add"> 
  <object class="SerialableObject"> 
  <void property="id"> 
   <int>1</int> 
  </void> 
  <void property="name"> 
   <string>Java序列化为XML - 1</string> 
  </void> 
  <void property="value"> 
   <double>3.14</double> 
  </void> 
  </object> 
 </void> 
 <void method="add"> 
  <object class="SerialableObject"> 
  <void property="id"> 
   <int>2</int> 
  </void> 
  <void property="name"> 
   <string>Java序列化为XML - 2</string> 
  </void> 
  <void property="value"> 
   <double>3.14159</double> 
  </void> 
  </object> 
 </void> 
 <void method="add"> 
  <object class="SerialableObject"> 
  <void property="id"> 
   <int>3</int> 
  </void> 
  <void property="name"> 
   <string>Java序列化为XML - 3</string> 
  </void> 
  <void property="value"> 
   <double>3.1415926</double> 
  </void> 
  </object> 
 </void> 
 <void method="add"> 
  <object class="SerialableObject"> 
  <void property="id"> 
   <int>4</int> 
  </void> 
  <void property="name"> 
   <string>Java序列化为XML - 4</string> 
  </void> 
  <void property="value"> 
   <double>3.141592653</double> 
  </void> 
  </object> 
 </void> 
 <void method="add"> 
  <object class="SerialableObject"> 
  <void property="id"> 
   <int>5</int> 
  </void> 
  <void property="name"> 
   <string>Java序列化为XML - 5</string> 
  </void> 
  <void property="value"> 
   <double>3.14159265359</double> 
  </void> 
  </object> 
 </void> 
 </object> 
</java>

Résumé

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:
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