序列化android.net.Uri对象

序列化android.net.Uri对象,android,serialization,Android,Serialization,我想序列化android.net.Uri类型的对象的状态 下面是我使用writeObject和readObject方法的模型类 public class ReminderObject implements Serializable { private boolean isReminderOn; private int fromHours, toHours; private int interval; private ArrayList<CharSequence> daysToRepe

我想序列化android.net.Uri类型的对象的状态

下面是我使用writeObject和readObject方法的模型类

public class ReminderObject implements Serializable {
private boolean isReminderOn;
private int fromHours, toHours;
private int interval;
private ArrayList<CharSequence> daysToRepeat;
private Uri toneToPlay;
private AdvanceSettingsObject adv;

public ReminderObject(boolean isReminderOn, int fromHours, int toHours,
        int interval, ArrayList<CharSequence> daysToRepeat, Uri toneToPlay,
        AdvanceSettingsObject adv) {
    super();
    this.isReminderOn = isReminderOn;
    this.fromHours = fromHours;
    this.toHours = toHours;
    this.interval = interval;
    this.daysToRepeat = daysToRepeat;
    this.toneToPlay = toneToPlay;
    this.adv = adv;
} 
/*
getters and setters
*/
    public void writeObject(ObjectOutputStream op){
    try {
        op.defaultWriteObject();
        op.writeChars(toneToPlay.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public void readObject(ObjectInputStream in){
    try{
        in.defaultReadObject();
        toneToPlay = Uri.parse(in.readUTF());
    }catch(Exception e){

    }
}

}
面临的例外情况:

03-31 23:47:59.246:W/System.err(12681):java.io.notserializableeexception:android.net.Uri$HierarchicalUri
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
03-31 23:47:59.246:W/System.err(12681):位于java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
03-31 23:47:59.246:W/System.err(12681):在com.navkar.navkarrememployer.setemployeractivity.schedulemployer(setemployeractivity.java:595)


请求帮助。

因为我认为问题在于您保存的数据成员


private-Uri-toneToPlay
是一种非序列化数据类型,您无法序列化它。

Uri
private-Uri-toneToPlay
不可序列化。因此,有一种替代方法,您可以将数据类型URI更改为String,并将URI转换为String,将String转换为URI,同时在vise versa中使用

字符串的Uri

Uri uri;
String stringUri;
stringUri = uri.toString();
字符串到Uri

Uri uri;
String stringUri;
uri = Uri.parse(stringUri);

考虑改用
java.net.URI
类。这几乎具有相同的功能,但它是可序列化的。您可以轻松地从Uri转换为Uri(并向后):

Uri到Uri
新Uri(Uri.toString())


URI-to-URI
URI.parse(URI.toString())
当我们仍然想将URI作为一个成员(例如为了方便)并序列化类时,一个可能的解决方案是使URI
暂时化
并序列化
URI字符串
(如@King of mass所示)

这样我们就不会更改POJO的公共接口,也不会序列化Uri,而是以一种惰性的方式创建它

具有Uri的可序列化POJO可以如下所示:

class MediaFile implements Serializable {

    private static final long serialVersionUID = -420L;    

    @Nullable
    private transient Uri mFileUri;

    @NonNull
    private String mFileUriString;

    MediaFile(@NonNull Uri fileUri) {
        this.mFileUriString = fileUri.toString();
    }

    @NonNull
    public getFileUri() {
        if (mFileUri == null) {
            mFileUri = Uri.parse(mFileUriString);
        }
        return mFileUri;
    }


}
对于kotlin:

class MediaFile(uri: Uri) : Serializable {
    private val mUriString = uri.toString();
    @Transient private val mUri by lazy { Uri.parse(mUriString) }
}

是的,Uri不可序列化,因此我将其更改为字符串。不要忘记标记答案solve。这有助于其他人找到答案。
Uri
可序列化!看看这个
class MediaFile(uri: Uri) : Serializable {
    private val mUriString = uri.toString();
    @Transient private val mUri by lazy { Uri.parse(mUriString) }
}