2

메신저 자바와 안드로이드에서 초보자를 marshmalow, 내가 후속 얻을 "java.io.StreamCorruptedException가를 : 잘못된 형식 : 0"ObjectInputStream를 java.io.StreamCorruptedException가 : 잘못된 형식 :</p> <p>: 0 사탕과

내가 그 물건을 다시 읽으려고 할 때. 하지만 난 단지 롤리팝과 마시맬로 장치에 달려 있는데, 이것을 누 가트 (7.1)에서 실행할 때 전혀 문제가 없습니다. 제안 사항이 있으십니까?

public class MainActivity extends AppCompatActivity { 

public final String FILE_NAME = "FILE_NAME"; 
private List<Item>; 
private ReadWriteFunctions readWriteFunctions = new ReadWriteFunctions(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final Bitmap defaultBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.no_pic); 

    //Read from internal storage 
    items =readWriteFunctions.readObj(this,FILE_NAME); 
    if (items == null){//if the file don't exist it returns null 
     items = new ArrayList<>(); 
     items.add(new Item(false,"",defaultBitmap)); 
     Log.d("readObj", "Created new list"); 
    } 

클래스 코드 :

public class ReadWriteFunctions { 


public ArrayList<Item> readObj(Context context, String fileName) { 
    ArrayList<Item> arrayList; 
    try { 
     FileInputStream fis = context.openFileInput(fileName); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     arrayList = (ArrayList<Item>) ois.readObject(); 
     ois.close(); 
     return arrayList; 
    }catch (IOException | ClassNotFoundException e){ 
     e.printStackTrace(); 
     return null; 
    } 
} 

public void writObj(Context context,String fileName,Object obj) { 
    try { 
     FileOutputStream fos = context.openFileOutput(fileName,Context.MODE_PRIVATE); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(obj); 
     oos.close(); 
     Log.d("writObj", "Saved"); 
    }catch (IOException e){ 
     e.printStackTrace(); 
     Log.d("writObj", "Save Fault"); 
    } 

} 

}

공용 클래스 항목은 내가 누군가를위한 문제를 해결하는 방법을 게시 직렬화 {

private boolean itemChecked; 
private String itemText; 
private transient Bitmap itemPicture; 


public Item(Item item) {//Constructor that receive item 
    this.setItemChecked(item.isItemChecked()); 
    this.setItemText(item.getItemText()); 
    this.setItemPicture(item.getItemPicture()); 

} 

public Item(boolean itemChecked, String itemText, Bitmap itemPicture) { 
    this.itemChecked = itemChecked; 
    this.itemText = itemText; 
    this.itemPicture = itemPicture; 
} 


public boolean isItemChecked() { 
    return itemChecked; 
} 

public void setItemChecked(boolean itemChecked) { 
    this.itemChecked = itemChecked; 
} 

public String getItemText() { 
    return itemText; 
} 

public void setItemText(String itemText) { 
    this.itemText = itemText; 
} 

public Bitmap getItemPicture() { 
    return itemPicture; 
} 

public void setItemPicture(Bitmap itemPicture) { 
    this.itemPicture = itemPicture; 
} 



private void writeObject(java.io.ObjectOutputStream out) throws IOException { 

    itemPicture.compress(Bitmap.CompressFormat.PNG, 100, out); 
    out.defaultWriteObject(); 

} 

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { 

    itemPicture = BitmapFactory.decodeStream(in); 
    in.defaultReadObject(); 

} 

}

+0

게시물 Item.readObject –

+0

이 아이템 클래스 –

+0

을 올렸습니다. 이제 오류를 제거했습니다 ... [mcve] –

답변

1

구현 누가 앞으로도 같은 문제가 발생합니다.

은 :

public class Item implements Serializable 

내가 변경 :이 라인 :

private Boolean itemChecked; 

내가 부울 프리미티브를 알고

직렬화이다 그래서 난 이유를 잘 모릅니다 :

private boolean itemChecked; 

을이 라인에 그것은 Nougat에서 효과가 있었고 롤리팝을 위해 작동하지 않은 이유를 이해하지 못합니다. & 마시맬로. 하지만 지금은 잘 작동합니다. 누군가가 그 이유를 알고 있다면 기쁜 마음으로 듣겠습니다.