Проблема, с которой я столкнулся, связана с сериализацией и декодированием JSON. Я пытаюсь сериализовать сообщение Protobuf, чтобы использовать его с сохранением redux.
Это метод, который я вызываю для сериализации моего объекта:
Map<String, dynamic> toJSON(){
return <String, dynamic>{
'isLogged': this.isLogged,
'isExpired': this.isExpired,
'protoUser':
this.protoUser == null ? null : this.protoUser.writeToJsonMap()),
'error': this.error,
}
};
и это метод, который я использую для чтения сохраненного состояния:
factory AuthState.fromJSON(Map<String, dynamic> json){
new AuthState(
isLogged: json['isLogged'],
isExpired: json['isExpired'],
error: json['error'],
protoUser: json['protoUser'] == null
? null
: new Auth.fromJson(json['protoUser'].toString()),
);
}
У меня проблема в том, что writeToJsonMap
не записывает действительную карту JSON для dart. Поэтому при чтении сериализованного состояния я получаю эту ошибку:
E/flutter (24643): FormatException: Unexpected character (at character 2)
E/flutter (24643): {1: 200, 2: test1, 3: test2, 4: {1: 1, 3: Mike, 4: tester}}
тоже спрашивал на https://github.com/dart-lang/protobuf/issues/136
redux persist - это пакет для сохранения хранилища redux, которое содержит состояние приложения. Я имею в виду при чтении сериализованного файла.
Вы делаете что-то не так, но, вероятно, это что-то в коде, не включенное в ваш вопрос.
он похож на github.com/FranPitri/flutter_redux_boilerplate ... с той лишь разницей, что вместо использования модели User я использовал объект protobuf.
и все работает, если я удалю protoUser (где кодирование / декодирование json неправильное)
Это похоже на кодировку JSON для транспорта protobuf, а не для пользовательского использования. Protobuf использует числовые индексы полей для экономии места.
Собственно, я пытаюсь найти способ решения этой проблемы.
В настоящее время существует запрос на включение имен полей. https://github.com/dart-lang/protobuf/pull/83
Что это значит при чтении сериализованного состояния?