跳到主要内容

@Type装饰器:标记类属性的类型

为了实现序列化类时不丢失属性的复杂类型,开发者可以使用@Type装饰器装饰类属性。

@Type的目的是标记类属性,配合PersistenceV2使用,防止序列化时类丢失。在阅读本文档前,建议提前阅读:PersistenceV2

@Type从API version 12开始支持。

从API version 12开始,该装饰器支持在元服务中使用。

概述

@Type标记类属性,使得类属性序列化时不丢失类型信息,便于类的反序列化。

装饰器说明

@Type装饰器说明
装饰器参数type:类型。
可装饰的类型Object class以及Array、Date、Map、Set等内嵌类型。

使用限制

  1. 只能用在@ObservedV2装饰的类中,不能用在自定义组件中。

    class Sample {
    private data: number = 0;
    }
    @ObservedV2
    class Info {
    @Type(Sample)
    @Trace public sample: Sample = new Sample(); // 正确用法
    }
    @Observed
    class Info2 {
    @Type(Sample)
    sample: Sample = new Sample(); // 错误用法,不能用在@Observed装饰的类中,编译时报错
    }
    @ComponentV2
    struct Index {
    @Type(Sample)
    sample: Sample = new Sample(); // 错误用法,不能用在自定义组件中,编译时报错
    build() {
    }
    }
  2. 不支持collections.Set、collections.Map等类型。

  3. 不支持非built-in类型。如PixelMap、NativePointer、ArrayList等Native类型。

  4. 不支持简单类型。如string、number、boolean等。

  5. 不支持构造函数含参的类。

使用场景

持久化数据

import { PersistenceV2, Type } from '@kit.ArkUI';

@ObservedV2
class SampleChild {
@Trace childNumber: number = 1;
}

@ObservedV2
class Sample {
// 对于复杂对象需要@Type修饰,确保反序列化成功,去掉@Type会反序列化值失败。
@Type(SampleChild)
// 对于没有初值的类属性,经过@Type修饰后,需要手动保存,否则持久化失败。
// 无法使用@Type修饰的类属性,必须要有初值才能持久化。
@Trace sampleChild?: SampleChild = undefined;
}

@Entry
@ComponentV2
struct TestCase {
@Local sample: Sample = PersistenceV2.connect(Sample, () => new Sample)!;

build() {
Column() {
Text('childNumber value:' + this.sample.sampleChild?.childNumber)
.onClick(() => {
this.sample.sampleChild = new SampleChild();
this.sample.sampleChild.childNumber = 2;
PersistenceV2.save(Sample);
})
.fontSize(30)
}
}
}