Java对象的序列化与反序列化:默认格式及JSON格式(使用jackson)

我的技术博客经常被流氓网站恶意爬取转载。请移步原文:http://www.cnblogs.com/hamhog/p/3558663.html,享受整齐的排版、有效的链接、正确的代码缩进、更好的阅读体验。

【默认格式】

public class MyClass implements Serializable{

...}

序列化:

ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(outputPath)); 
output.writeObject(myObject);

反序列化:

ObjectInputStream input = new ObjectInputStream(new FileInputStream(inputPath)); 

return (MyClass)input.readObject();

【JSON格式】

使用jackson包。jackson是一个效率非常高的Java JSON包。文档和下载见官网

序列化:

ObjectMapper mapper = new ObjectMapper();

mapper.writeValue(new File(outputPath), myObject);

反序列化:

return mapper.readValue(new File(outputPath), MyClass.class);

【完整测试代码】

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的属性和静态属性。

你可能感兴趣的:(Jackson)