HarmonyOS-Sequenceable(序列化)中,URI类型如何实现读取序列化对象

请问HarmonyOS-Sequenceable(序列化)中,URI类型如何实现读取序列化对象。

使用Android-Parcelable(序列化) URI类型反序列化实现方式:

protected Image(Parcel in) {
    this.path = in.readString();
    this.time = in.readLong();
    this.name = in.readString();
    this.mimeType = in.readString();
    this.uri = in.readParcelable(Uri.class.getClassLoader());
}

HarmonyOS-Parcel中对应的readSequenceable返回布尔类型,无法实现读取序列化对象

HarmonyOS-Sequenceable(序列化)中,URI类型如何实现读取序列化对象-鸿蒙开发者社区

HarmonyOS
Parcel
Sequenceable
序列化
readParcelable
2021-02-25 09:35:14
浏览
收藏 1
回答 3
已解决
回答 3
按赞同
/
按时间
张荣超_九丘教育
4

可以调用方法readSerializable(),如下图所示:

分享
微博
QQ
微信
回复1
2021-02-25 11:21:49
yanyw9
4

这段代码运行OK,可以正确传递Student对象到下一个ability。

关键点在红色代码。

import ohos.utils.Parcel;
import ohos.utils.Sequenceable;
import ohos.utils.net.Uri;

public class Student implements Sequenceable {
    private int number;
    private String name;
    private Uri uri;

    public Student() {
    }

    public Student(int number, String name, Uri uri) {
        this.number = number;
        this.name = name;
        this.uri = uri;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Uri getUri() {
        return uri;
    }

    public void setUri(Uri uri) {
        this.uri = uri;
    }

    //上面是传统的实体类的构造函数和getter、setter
    //下面是序列化的核心
    //向包裹中写入数据,包裹可以理解为一块内存区
    public boolean marshalling(Parcel out) {
        out.writeTypedSequenceable(this.uri); //注意Uri类型的写法和普通数据类型有所不同
        out.writeInt(this.number);
        out.writeString(this.name);
        return true;
    }

    //从包裹中读取数据
    public boolean unmarshalling(Parcel in) {
        this.uri = in.createSequenceable(Uri.class.getClassLoader());
        this.number = in.readInt();
        this.name = in.readString();
        return true;    //注意Uri类型的写法和普通数据类型有所不同
    }


    //序列化对象的内部构造器,必须实现
    public static final Sequenceable.Producer PRODUCER = new Producer() {
        public Student createFromParcel(Parcel in) {    //从包裹中获取数据构造对象
            // Initialize an instance first, then do customized unmarshlling.
            Student instance = new Student();
            instance.unmarshalling(in);
            return instance;
        }   //必须实现Producer
    };

}

已于2021-6-19 01:30:38修改
分享
微博
QQ
微信
回复
2021-06-19 01:29:00
开源夏德旺
3

 Boolean b= parcel.readSequenceable(this.uri);

采用这个读取即可,Uri类也是实现了Sequenceable接口的,而readSequenceable方法需要接收一个Sequenceable类型的参数

实现序列化的操作必须要实现一个关键的Sequenceable的内部接口构造器Sequenceable.Producer,如下

    public static final Sequenceable.Producer<Student> CREATOR = new Producer<Student>() {
        @Override
        public Student createFromParcel(Parcel parcel) {
            Student student = new Student();
            student.id = parcel.readInt();
            student.name = parcel.readString();
            parcel.readSequenceable(student.uri);
            return student;
        }//必须实现的方法

    };
分享
微博
QQ
微信
回复3
2021-02-25 18:49:35
相关问题
求大佬告知如何序列化对象
632浏览 • 1回复 待解决
自定义类如何实现序列化
1872浏览 • 1回复 待解决
有谁知道 task 参数无法序列化
1735浏览 • 1回复 待解决
HarmonyOS JSON的map结构如何序列化
367浏览 • 1回复 待解决
JSON反序列化如何重命名字段?
145浏览 • 1回复 待解决
卡片开发如何实现数据持久
1989浏览 • 1回复 待解决
PersistentStorage如何持久一个对象?
2744浏览 • 1回复 待解决