Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Java——在Android平台上反序列化文件_Java_Android_File_Serialization - Fatal编程技术网

Android Java——在Android平台上反序列化文件

Android Java——在Android平台上反序列化文件,java,android,file,serialization,Java,Android,File,Serialization,我有一个jave程序,可以序列化以后存储和读取的文件。因此,我使用Java SE中使用的完全相同的代码,在我的Android手机(在Eclipse中工作)上读取序列化文件: FileInputStream fis = null; try { fis = new FileInputStream("iwastedahalfhouronthis.ser"); } catch (FileNotFoundException ex) { } 抛出FileNotFoundException。

我有一个jave程序,可以序列化以后存储和读取的文件。因此,我使用Java SE中使用的完全相同的代码,在我的Android手机(在Eclipse中工作)上读取序列化文件:


FileInputStream fis = null;
try {
    fis = new FileInputStream("iwastedahalfhouronthis.ser");
   } catch (FileNotFoundException ex) {
}
抛出FileNotFoundException。所以好吧,它可能不在正确的地方。因此,我将文件放在Eclipse项目中每个可能的文件夹中,并尝试从这些位置加载。不走运。确保文件名正确无误。使用eclipse提供的完全限定名:“/plessehelp/src/com/imlosingit/iwastedahalfhouronthis.ser”。不走运。将文件对象传递到FileInputStream。不走运。这在Java上非常简单。这是怎么回事

-----------编辑解决方案--------------------


        Data data = null; //object to be deserialized
        InputStream is = null;
        ObjectInputStream ois=null;
        AssetManager assets = getAssets();
        is = assets.open("fff.ser");
        ois = new ObjectInputStream(is);
        data = (com.data.Data) ois.readObject();

以a为例-序列化文件应转到
/data/data/APP_PACKAGE/iwastedahalfhouronthis.ser

查看中的一些getter。尝试将文件保存到缓存文件夹中,或者如果它们是大文件,您可能需要尝试外部目录(例如SD卡)

编辑:阅读您的评论后,我建议将序列化文件存储在
/assets
下。然后,您可以使用AssetManager检索以下内容:

AssetManager assets = getAssets();
AssetFileDescriptor afd = assets.openFd("iwastedhalfhouronthis.ser");
FileInputStream fis = afd.createInputStream();
编辑:还有一件事要尝试。将.ser文件放在名为
/raw
的新文件夹中(您必须手动创建),然后尝试以下操作:

Resources res = getResources();
//might need "R.raw.iwastedhalfhouronthis.ser" but I don't think so.
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.iwastedhalfhouronthis);
FileInputStream fis = afd.createInputStream();

将文件放在/res/assets目录中。然后,您可以使用Context.getAssets()返回AssetManager实例来处理assets目录中的文件。

我认为我们有类似的情况,javaSe应用程序生成二进制文件,android必须读取它

我就是这样做的。 首先将文件放在res/raw中

 Resources res = getResources();
 InputStream is = res.openRawResource(R.raw.kasalvage);
 ObjectInputStream ois =new ObjectInputStream(is);
 //Blueprint is my custom object
 bp = (BlueprintMap)ois.readObject();
 Toast.makeText(this, bp.getTitle(), 2000).show();
我必须制作一个包含BlueprintMap类模型的Jar库,并将其导入到桌面应用程序和android应用程序的项目中,这样就消除了ClassNotFoundException。
我希望这会有所帮助

您在创建文件时是否尝试过打印文件的存储位置?不清楚您是否在手机上使用Android代码创建文件,如果您正在使用apk打包文件或使用HTTP等进行下载,请进一步解释-在Android设备上有许多地方可以存储文件,了解您如何创建和存储文件可能会有助于他人为您提供查找文件的方法。这些文件是在我的笔记本电脑上创建的,导入到eclipse项目的不同位置(我在src dir旁边创建的一个dir,在src dir中),然后使用调试器在我的智能手机上运行该程序。我希望所有的序列化文件都存储在apk中。对任何人来说--为什么这个warrent关闭了?它与文本文件一起工作,所以大的改进只需要输入一些东西就可以了。不适用于序列化文件。有什么建议吗?谢谢,伙计。不幸的是,我没有序列化文件的经验,但我不明白为什么它会引起问题。通过“不工作”,你会得到一个例外吗?数据不正确?具体是什么?assets.openFd(“text.txt”)返回一个文件,而assets.openFd(“serial.ser”)返回null。我已经测试了序列化文件,它可以在我的桌面java程序上运行。我觉得这会花我一整天的时间来找到一个两行的解决方案。谢谢你,老兄。你的第一个解决方案非常接近。
 Resources res = getResources();
 InputStream is = res.openRawResource(R.raw.kasalvage);
 ObjectInputStream ois =new ObjectInputStream(is);
 //Blueprint is my custom object
 bp = (BlueprintMap)ois.readObject();
 Toast.makeText(this, bp.getTitle(), 2000).show();