如何在Dart中使用json_注释将Uint8List序列化为json?

如何在Dart中使用json_注释将Uint8List序列化为json?,json,flutter,dart,Json,Flutter,Dart,我创建了一个简单的类,它有一个Uint8List成员: import "package:json_annotation/json_annotation.dart"; part "openvpn.g.dart"; @JsonSerializable() class OpenVPN extends VPN { OpenVPN(Uint8List profile) { this.profile = profile; } /... Uin

我创建了一个简单的类,它有一个
Uint8List
成员:

import "package:json_annotation/json_annotation.dart";
part "openvpn.g.dart";

@JsonSerializable()
class OpenVPN extends VPN {
  OpenVPN(Uint8List profile) {
    this.profile = profile;
  }
  /...
  Uint8List profile = null;
但是,在运行build runner生成json序列化程序时,我得到:

Could not generate `fromJson` code for `profile`.
None of the provided `TypeHelper` instances support the defined type.
package:my_app/folder/openvpn.dart:19:13
   ╷
19 │   Uint8List profile = null;
   │             ^^^^^^^
有没有办法为这种类型编写自己的序列化程序?还是有更简单的方法?
我不希望json文件中有字符串,我希望有实际的字节。它是一个小文件,因此在json中存储为字节数组是有意义的。

在您的
OpenVPN
序列化方法中,将
Uint8List
转换为
列表。根据您的实现,它可能看起来像:

classopenvpn{
factory OpenVPN.fromJson(动态映射){
返回OpenVPN(
...
配置文件:Uint8List.fromList(映射['profile']??[]),其中,
);
}
toJson(){
返回{
...
“配置文件”:配置文件作为列表,
};
}
}

为Uint8List添加自定义JSON转换器

import 'dart:typed_data';
import 'package:json_annotation/json_annotation.dart';

class Uint8ListConverter implements JsonConverter<Uint8List, List<int>> {
  const Uint8ListConverter();

  @override
  Uint8List fromJson(List<int> json) {
    if (json == null) {
      return null;
    }

    return Uint8List.fromList(json);
  }

  @override
  List<int> toJson(Uint8List object) {
    if (object == null) {
      return null;
    }

    return object.toList();
  }
}
在根项目路径中,从终端运行以生成
open_vpn.g.dart
部分文件:
flatter包发布运行构建\u运行构建--删除冲突输出

import 'package:json_annotation/json_annotation.dart';
import 'dart:typed_data';
import 'package:.../uint8_list_converter.dart';

part 'open_vpn.g.dart';

@JsonSerializable(explicitToJson: true)
class OpenVPN {
  OpenVPN({this.profile});

  @Uint8ListConverter()
  Uint8List profile = null;

  factory OpenVPN.fromJson(Map<String, dynamic> json) =>
      _$OpenVPNFromJson(json);

  Map<String, dynamic> toJson() => _$OpenVPNToJson(this);
}