2013-03-02 72 views
0

我无法将对象存储到设备存储上。起初,我得到了一个NotSerializableException,所以我创建了Serializable对象,现在在try {} catch {}块中,它抛出了一个StreamCorruptedException,我认为它指向in = new ObjectInputStream(byteArray);这一行。结果是这个列表没有被填充。我可以在try {} catch {}块之外填充列表,但这会破坏将列表对象存储在设备上的目的。下面是相关代码:StreamCorruptedException被捕获?

public class MainListFragment extends ListFragment implements Serializable { 

    OnListSelectedListener mCallback; 
    public transient ObjectStorage mainObjectList = new ObjectStorage(); // creates 
                     // the 
                     // list 
                     // of 
                     // objects 
    SharedPreferences mPrefs; 
    int mCurrentPosition = -1; 

    // The container Activity must implement this interface so the frag can 
    // deliver messages 
    public interface OnListSelectedListener { 

     /** Called by ListFragment when a list item is selected */ 
     public void onItemSelected(int position, String schedulename, 
       String[] ampm, boolean[] days, int[] times, boolean vibrate); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     updateStorage(); 
     ByteArrayInputStream byteArray = new ByteArrayInputStream(mPrefs 
       .getString("myobject", "").getBytes()); 
     ObjectInputStream in; 
     try { 
      in = new ObjectInputStream(byteArray); 
      ObjectStorage updatedStorageList = (ObjectStorage) in.readObject(); 
      Log.i("mydebug", "Populating list with storage"); 
      CustomListAdapter adapter = new CustomListAdapter(getActivity(), 
        R.layout.listview_item_row, updatedStorageList); 
      // setListAdapter(new ArrayAdapter<String>(getActivity(), layout, 
      // arraylist)); 
      setListAdapter(adapter); 
      setListShown(true); 
     } catch (StreamCorruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void updateStorage() { 
     getActivity();// used for MODE_PRIVATE 

     // store object list into android system 
     mPrefs = getActivity().getPreferences(Context.MODE_PRIVATE); 
     SharedPreferences.Editor ed = mPrefs.edit(); 
     ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); 
     ObjectOutputStream out; 
     try { 
      Log.i("mydebug", "Updating object storage"); 
      out = new ObjectOutputStream(arrayOutputStream); 
      out.writeObject(mainObjectList); 
      out.close(); 
      arrayOutputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     ed.putString("myobject", arrayOutputStream.toString()); 
     ed.commit(); 
    } 
} 

还有logcat的信息:

03-02 00:41:07.857: I/mydebug(12435): TEMPMAINFRAG: MainListFragment{41dfe598 id=0x7f070028} 
03-02 00:41:07.857: I/mydebug(12435): 1 
03-02 00:41:07.857: D/AbsListView(12435): Get MotionRecognitionManager 
03-02 00:41:07.877: D/AbsListView(12435): Get MotionRecognitionManager 
03-02 00:41:07.877: I/mydebug(12435): Updating object storage 
03-02 00:41:07.877: W/System.err(12435): java.io.StreamCorruptedException 
03-02 00:41:07.877: W/System.err(12435): at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2106) 
03-02 00:41:07.877: W/System.err(12435): at java.io.ObjectInputStream.<init>(ObjectInputStream.java:372) 
03-02 00:41:07.877: W/System.err(12435): at com.example.android.fragments.MainListFragment.onStart(MainListFragment.java:94) 
03-02 00:41:07.877: W/System.err(12435): at android.support.v4.app.Fragment.performStart(Fragment.java:1332) 
03-02 00:41:07.877: W/System.err(12435): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906) 
03-02 00:41:07.877: W/System.err(12435): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
03-02 00:41:07.877: W/System.err(12435): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
03-02 00:41:07.877: W/System.err(12435): at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1815) 
03-02 00:41:07.877: W/System.err(12435): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:518) 
03-02 00:41:07.877: W/System.err(12435): at com.example.android.fragments.MainActivity.onStart(MainActivity.java:104) 
03-02 00:41:07.877: W/System.err(12435): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178) 
03-02 00:41:07.887: W/System.err(12435): at android.app.Activity.performStart(Activity.java:5058) 
03-02 00:41:07.887: W/System.err(12435): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061) 
03-02 00:41:07.887: W/System.err(12435): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113) 
03-02 00:41:07.887: W/System.err(12435): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3554) 
03-02 00:41:07.887: W/System.err(12435): at android.app.ActivityThread.access$800(ActivityThread.java:139) 
03-02 00:41:07.887: W/System.err(12435): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1230) 
03-02 00:41:07.887: W/System.err(12435): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-02 00:41:07.887: W/System.err(12435): at android.os.Looper.loop(Looper.java:137) 
03-02 00:41:07.887: W/System.err(12435): at android.app.ActivityThread.main(ActivityThread.java:4918) 
03-02 00:41:07.887: W/System.err(12435): at java.lang.reflect.Method.invokeNative(Native Method) 
03-02 00:41:07.887: W/System.err(12435): at java.lang.reflect.Method.invoke(Method.java:511) 
03-02 00:41:07.887: W/System.err(12435): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
03-02 00:41:07.887: W/System.err(12435): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
03-02 00:41:07.887: W/System.err(12435): at dalvik.system.NativeStart.main(Native Method) 
03-02 00:41:07.947: I/Adreno200-EGLSUB(12435): <ConfigWindowMatch:2087>: Format RGBA_8888. 
03-02 00:41:08.908: I/mydebug(12435): TEMPMAINFRAG: MainListFragment{41e237f8 id=0x7f070028} 
03-02 00:41:08.908: I/mydebug(12435): 1 
03-02 00:41:08.918: D/AbsListView(12435): Get MotionRecognitionManager 
03-02 00:41:08.928: D/AbsListView(12435): Get MotionRecognitionManager 
03-02 00:41:08.938: I/mydebug(12435): Updating object storage 
03-02 00:41:08.938: W/System.err(12435): java.io.StreamCorruptedException 
03-02 00:41:08.938: W/System.err(12435): at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2106) 
03-02 00:41:08.938: W/System.err(12435): at java.io.ObjectInputStream.<init>(ObjectInputStream.java:372) 
03-02 00:41:08.938: W/System.err(12435): at com.example.android.fragments.MainListFragment.onStart(MainListFragment.java:94) 
03-02 00:41:08.938: W/System.err(12435): at android.support.v4.app.Fragment.performStart(Fragment.java:1332) 
03-02 00:41:08.938: W/System.err(12435): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906) 
03-02 00:41:08.938: W/System.err(12435): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
03-02 00:41:08.938: W/System.err(12435): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
03-02 00:41:08.948: W/System.err(12435): at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1815) 
03-02 00:41:08.948: W/System.err(12435): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:518) 
03-02 00:41:08.948: W/System.err(12435): at com.example.android.fragments.MainActivity.onStart(MainActivity.java:104) 
03-02 00:41:08.948: W/System.err(12435): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178) 
03-02 00:41:08.948: W/System.err(12435): at android.app.Activity.performStart(Activity.java:5058) 
03-02 00:41:08.948: W/System.err(12435): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061) 
03-02 00:41:08.948: W/System.err(12435): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113) 
03-02 00:41:08.948: W/System.err(12435): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3554) 
03-02 00:41:08.948: W/System.err(12435): at android.app.ActivityThread.access$800(ActivityThread.java:139) 
03-02 00:41:08.948: W/System.err(12435): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1230) 
03-02 00:41:08.948: W/System.err(12435): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-02 00:41:08.948: W/System.err(12435): at android.os.Looper.loop(Looper.java:137) 
03-02 00:41:08.958: W/System.err(12435): at android.app.ActivityThread.main(ActivityThread.java:4918) 
03-02 00:41:08.958: W/System.err(12435): at java.lang.reflect.Method.invokeNative(Native Method) 
03-02 00:41:08.958: W/System.err(12435): at java.lang.reflect.Method.invoke(Method.java:511) 
03-02 00:41:08.958: W/System.err(12435): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
03-02 00:41:08.958: W/System.err(12435): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
03-02 00:41:08.958: W/System.err(12435): at dalvik.system.NativeStart.main(Native Method) 
03-02 00:41:09.178: I/Adreno200-EGLSUB(12435): <ConfigWindowMatch:2087>: Format RGBA_8888. 
03-02 00:41:52.326: W/IInputConnectionWrapper(12435): getExtractedText on inactive InputConnection 
03-02 00:41:52.326: W/IInputConnectionWrapper(12435): getTextBeforeCursor on inactive InputConnection 
03-02 00:41:52.326: W/IInputConnectionWrapper(12435): getSelectedText on inactive InputConnection 
03-02 00:41:52.326: W/IInputConnectionWrapper(12435): getTextAfterCursor on inactive InputConnection 
03-02 00:41:52.326: W/IInputConnectionWrapper(12435): getExtractedText on inactive InputConnection 
03-02 00:41:52.326: W/IInputConnectionWrapper(12435): getTextBeforeCursor on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getExtractedText on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getTextBeforeCursor on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getSelectedText on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getTextAfterCursor on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getExtractedText on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getTextBeforeCursor on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getSelectedText on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getTextAfterCursor on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): beginBatchEdit on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): endBatchEdit on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getExtractedText on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getTextBeforeCursor on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getSelectedText on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): getTextAfterCursor on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): beginBatchEdit on inactive InputConnection 
03-02 00:41:52.336: W/IInputConnectionWrapper(12435): endBatchEdit on inactive InputConnection 

回答

0

破除一切ByteArrayInput/OutputStreams,转换为字符串,String.getBytes()调用,以及其他一切这不是直接调用writeObject()与要串行化的对象,直接连接到FileOutputStream,或者直接从直接连接到FileInputStream的ObjectInputStream直接读取对象。

您正在破坏三个或四个独立点上的数据。即使它没有破坏数据,它也没有实际需要这种malarkey。