個人技術博客常常被流氓網站惡意爬取轉載。請移步原文:http://www.cnblogs.com/hamhog/p/3558663.html,享受整齊的排版、有效的連接、正確的代碼縮進、更好的閱讀體驗。html
【默認格式】java
public class MyClass implements Serializable{ ...}
序列化:json
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(outputPath));
output.writeObject(myObject);
反序列化:app
ObjectInputStream input = new ObjectInputStream(new FileInputStream(inputPath)); return (MyClass)input.readObject();
【JSON格式】ide
使用jackson包。jackson是一個效率很是高的Java JSON包。文檔和下載見官網。測試
序列化:網站
ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(new File(outputPath), myObject);
反序列化:this
return mapper.readValue(new File(outputPath), MyClass.class);
【完整測試代碼】spa
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; public class Zoo implements Serializable { private static final long serialVersionUID = 1L; private static ObjectMapper mapper = new ObjectMapper(); public static int maxAnimalCount; public ArrayList<String> animals; public Zoo() { animals = new ArrayList<String>(); } public static void setMax(int max){ maxAnimalCount = max; } /** * Add an animal to animals Array. * @param animalName */ public void addAnimal(String animalName){ if (animals.size() < maxAnimalCount) animals.add(animalName); } @Override public String toString(){ return "Zoo: \n animals: " + animals.toString() + "\n maxAnimalCount: " + maxAnimalCount + "\n"; } /** * Output standard serialization to file at logPath. * @param logPath */ public void serializeToLog(String logPath) { ObjectOutputStream output = null; try { output = new ObjectOutputStream( new FileOutputStream(logPath)); output.writeObject(this); } catch(Exception e) { e.printStackTrace(); } finally { try { output.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * Output JSON serialization(using jackson) to file at logPath. * @param logPath */ public void serializeJSONToLog(String logPath){ try { mapper.writeValue(new File(logPath), this); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * Standard deserialize a Zoo instance from file at logPath. * @param logPath * @return deserialized zoo instance */ public static Zoo deserializeFromLog(String logPath) { ObjectInputStream input = null; try { input =new ObjectInputStream( new FileInputStream(logPath)); return (Zoo)input.readObject(); } catch(Exception e) { e.printStackTrace(); } finally { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * JSON deserialize a Zoo instance from file at logPath. * @param logPath * @return JSON deserialized zoo instance */ public static Zoo deserializeJSONFromLog(String logPath){ try { return mapper.readValue(new File(logPath), Zoo.class); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } } class ZooSerializeTest { public static void main(String[] args) { Zoo zoo1 = new Zoo(); Zoo.setMax(100); zoo1.addAnimal("hamster"); zoo1.addAnimal("sheep"); zoo1.serializeToLog("zoo1.log"); Zoo zoo2 = new Zoo(); Zoo.setMax(200); zoo2.addAnimal("tiger"); zoo2.serializeToLog("zoo2.log"); Zoo.setMax(300); //Deserialization zoo1 = Zoo.deserializeFromLog("zoo1.log"); zoo2 = Zoo.deserializeFromLog("zoo2.log"); System.out.println("zoo1: \n" + zoo1); System.out.println("zoo2: \n" + zoo2); //Serialize to JSON zoo1.serializeJSONToLog("zoo1.json"); zoo1 = Zoo.deserializeJSONFromLog("zoo1.json"); System.out.println("zoo1 from json: \n" + zoo1); } }
注意到默認的serialize會序列化private的屬性,不會序列化靜態屬性;而jackson不會序列化非public的屬性和靜態屬性。code