【发布时间】:2021-01-11 14:45:09
【问题描述】:
我曾经使用带有 Java 的 Android Studio 在 Android 中保存项目。但现在我想在我用 Flutter SDK(Dart 语言)重写的应用程序中准确地读取这些数据。但似乎编写的文件是非常特定于 Java 的。这是 Java 中的保存和加载方法。
public void save(Item item)
{
String json = gson.toJson(item);
FileOutputStream fos = null;
try {
fos = context.openFileOutput("item_"+ item.getUid(), Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(json);
os.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private Item loadItem(String fileName)
{
FileInputStream fis = null;
try {
fis = context.openFileInput(fileName);
ObjectInputStream is = new ObjectInputStream(fis);
Object object = is.readObject();
Item item = null;
String json = (String)object;
item = gson.fromJson(json, Item.class);
is.close();
fis.close();
return item;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
现在在 Dart 中阅读它
Uint8List bytes = f.readAsBytesSync();
var data = bytes.buffer.asByteData();
// HOW TO DETECT JAVA
if (?SOMETHING?) { }
bytes 的长度相当大。它是一个长度 = 3 245 500 的数组。
json 字符串的长度应该在 740 到 840 字节之间(即相对较短的 json)。
我怎么能只读取 json 部分而不是整个 Java 'overhead'/'java serialization format'
【问题讨论】:
-
我建议您阅读 Java 中的数据并切换到序列化为 json、xml 或其他与 Java 没有密切关联的格式。为此使用 Java 序列化是错误的工具,尝试用另一种语言阅读它是非常痛苦的。另外,将某些内容转换为json,然后将该字符串写入
ObjectOutputStream,这很奇怪,为什么不直接将json写入FileOutputStream? -
“编写的文件是 Java 特有的” 你是对的。
ObjectOutputStream用于编写供ObjectInStream读取的二进制文件(甚至在javadoc 中也这么说),而不是用于与其他语言的一般通信。如果要与其他语言交换数据,则应选择与语言无关的格式,例如 XML 或 JSON。 -
简而言之,去掉
ObjectOutputStream(可以用OutputStreamWriter代替),直接将json写入文件,不用Java的对象序列化格式包装。 -
Mark Rotteveel 是对的,尽管使用十六进制编辑器您可能会发现如何提取 json 部分(UTF-8 字符串)。
-
问题是Java版本已经发布了一年多,现在要在Flutter中替换应用程序,因此替换旧代码不是一个选项,因为仍然存在需要阅读的旧格式项目