Java Parcelable仅在某些手机中写入可序列化对象时遇到IOException
我在Fragment.java中的项目中遇到了这个异常,我不知道问题出在哪里,因为我已经为MyClass实现了Parcelable,应该不会有问题。 我错过什么了吗Java Parcelable仅在某些手机中写入可序列化对象时遇到IOException,java,android,crash,parcelable,Java,Android,Crash,Parcelable,我在Fragment.java中的项目中遇到了这个异常,我不知道问题出在哪里,因为我已经为MyClass实现了Parcelable,应该不会有问题。 我错过什么了吗 Fatal Exception: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = mypackage.a.a.a) at android.os.Parcel.writeSeria
Fatal Exception: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = mypackage.a.a.a)
at android.os.Parcel.writeSerializable(Parcel.java:1447)
at android.os.Parcel.writeValue(Parcel.java:1395)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:665)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1337)
at android.os.Bundle.writeToParcel(Bundle.java:1079)
at android.os.Parcel.writeBundle(Parcel.java:690)
at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:148)
at android.os.Parcel.writeTypedArray(Parcel.java:1233)
at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:564)
at android.os.Parcel.writeParcelable(Parcel.java:1416)
at android.os.Parcel.writeValue(Parcel.java:1322)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:665)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1337)
at android.os.Bundle.writeToParcel(Bundle.java:1079)
at android.os.Parcel.writeBundle(Parcel.java:690)
at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:150)
at android.os.Parcel.writeTypedArray(Parcel.java:1233)
at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:564)
at android.os.Parcel.writeParcelable(Parcel.java:1416)
at android.os.Parcel.writeValue(Parcel.java:1322)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:665)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1337)
at android.os.Bundle.writeToParcel(Bundle.java:1079)
at android.os.Parcel.writeBundle(Parcel.java:690)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3153)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3455)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5621)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
由java.io.NotSerializableException mypackage.model.MyClass引起
下面是MyClass
code:
public class MyClass implements Parcelable {
private transient JSONObject json;
public static final String KEY = "my_key";
public static final String VALUE = "my_value";
public MyClass(){
json = new JSONObject();
}
public MyClass(String json){
try {
if (!TextUtils.isEmpty(json)) {
json = new JSONObject(json);
}else {
json = new JSONObject();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public MyClass myMethod1(String s1, String s2){
//Do something here
}
public String myMethod2(String s1){
//Do something here
return null;
}
@Override
public String toString() {
return json.toString();
}
public String jsonText() {
return json.toString();
}
protected MyClass(Parcel in) {
try {
json = in.readByte() == 0x00 ? null : new JSONObject(in.readString());
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
if (json == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeString(json.toString());
}
}
public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() {
@Override
public MyClass createFromParcel(Parcel in) {
return new MyClass(in);
}
@Override
public MyClass[] newArray(int size) {
return new MyClass[size];
}
};
public static MyClass myMethod3(){
//Do something here
}
}
公共类MyClass实现了可包裹{
私有瞬态JSONObject json;
公共静态最终字符串KEY=“my_KEY”;
公共静态最终字符串值=“我的值”;
公共MyClass(){
json=新的JSONObject();
}
公共MyClass(字符串json){
试一试{
如果(!TextUtils.isEmpty(json)){
json=新的JSONObject(json);
}否则{
json=新的JSONObject();
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
公共MyClass myMethod1(字符串s1、字符串s2){
//在这里做点什么
}
公共字符串myMethod2(字符串s1){
//在这里做点什么
返回null;
}
@凌驾
公共字符串toString(){
返回json.toString();
}
公共字符串jsonText(){
返回json.toString();
}
受保护的MyClass(包裹中){
试一试{
json=in.readByte()==0x00?null:新的JSONObject(in.readString());
}捕获(JSONException e){
e、 printStackTrace();
}
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
if(json==null){
目标写入字节((字节)(0x00));
}否则{
目标写入字节((字节)(0x01));
dest.writeString(json.toString());
}
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
公共MyClass createFromParcel(地块中){
返回新的MyClass(在中);
}
@凌驾
公共MyClass[]新数组(整数大小){
返回新的MyClass[大小];
}
};
公共静态MyClass myMethod3(){
//在这里做点什么
}
}
我已经删除了一系列的方法,使其更简短。我有意在我的活动之间传递这个对象,我的代码在很多手机上都可以使用,但是这个异常只发生在一些手机上,而不是所有手机上。从表面上看,问题是你的类没有实现
Serializable
@StephenC我应该同时实现Serializable和Parcelable吗?我猜是的。试试看。@StephenC那么intent.putExtra()会有歧义,它不知道使用Serializable或Parcelable。然后可能会将它指向(Parcelable)yourObject