序列化与JSON

序列化与反序列化

public class Person {
    private int age;
    private int id;

    public Person() {

    }

    public Person(int age, int id) {
        this.age = age;
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public int getId() {
        return id;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Person{");
        sb.append("age=").append(age);
        sb.append(", id=").append(id);
        sb.append('}');
        return sb.toString();
    }
}



public class User extends Person implements Serializable {

    private static final long serialVersionUID = -5584877508890698288L;
    private String name;

    private int a;

    public User(int age, int id, String name) {
        super(age, id);
        this.name = name;
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        System.out.println("writeObject>>>>>");
        out.defaultWriteObject();
        out.writeInt(getId());
        out.writeInt(getAge());
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        System.out.println("readObject>>>>>");
        ois.defaultReadObject();
        setId(ois.readInt());
        setAge(ois.readInt());
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("User{");
        sb.append("name='").append(name).append('\'');
        sb.append('}');
        return sb.toString() + super.toString();
    }
}


public class Test {
    public static void main(String[] args) {
        try {
            test2();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("has error:" + e);
        }

    }

    public static void test() throws IOException, ClassNotFoundException {
        User user = new User(1, 2, "a1");
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
        oos.writeObject(user);
        System.out.println("write:" + user);
        byte[] bytes = byteArrayOutputStream.toByteArray();
        oos.close();

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        ObjectInputStream ois = new ObjectInputStream(byteArrayInputStream);
        Object o = ois.readObject();
        if (o != null) {
            User user1 = (User) o;
            System.out.println("read:" + user1);
        }
        ois.close();
    }

    public static void test2() throws IOException, ClassNotFoundException {
        User user = new User(1, 2, "a1");
        String path = "C:\\Users\\86150\\Desktop\\111\\a.bat";
        FileOutputStream fileOutputStream = new FileOutputStream(path);
        ObjectOutputStream oos = new ObjectOutputStream(fileOutputStream);
        oos.writeObject(user);
        oos.close();
        System.out.println("write:" + user);

        FileInputStream inputStream = new FileInputStream(path);
        ObjectInputStream ois = new ObjectInputStream(inputStream);
        Object o = ois.readObject();
        if (o != null) {
            User user1 = (User) o;
            ois.close();
            System.out.println("read:" + user1);
        }


    }
}
深浅拷贝

如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。

浅拷贝和深拷贝只是相对的,如果一个对象内部只有基本数据类型,那用 clone() 方法获取到的就是这个对象的深拷贝,而如果其内部还有引用数据类型,那用 clone() 方法就是一次浅拷贝的操作。

在这里插入图片描述

JSON

解析方式
. org.json解析

解析原理:基于文档驱动,需要把全部文件督导内存中去,然后遍历所有数据,根据
需要检索想要的数据。
具体使用: JSONObject JSONArray

. Gson解析

解析原理:基于事件驱动
解析流程:根据所需取的数据,建立1个对应JSON数据的JavaBean类,即可通过简单操作解析出所需数据。
Gson不要求JavaBean类里面的属性一定全部喝JSON数据里的所有key相同,可以按需取数据。

  • Fastjson
  • 常见问题

Caused by: java.lang.1llegalstateException: ExpectedBEGIN_ARRAY but
was STRING at line 3 column 17 path$.authors
解决方案:
自定义TypeAdapter
自定义JsonDeserializer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值