适用于Android的Mono,Parcelable& C# - 文档错误

时间:2012-01-31 04:40:34

标签: c# android mono parcelable

更新:

IParcelable显然cannot currently be implemented in Mono for Android。最后,我在类中使用了.NET序列化,然后在特定于Android的代码中对序列化数据进行了parceled / bundled,这很好用。它还使该类跨平台兼容,这是可取的。

原始问题:

我正在尝试将Parcelable实现为Mono for Android应用程序中的一部分,但是Xamarin的Parcelable文档是从Android文档中复制粘贴的:

http://androidapi.xamarin.com/?link=T%3aAndroid.OS.IParcelable

public class MyParcelable implements Parcelable {
 private int mData;

 public int describeContents() {
     return 0;
 }

 public void writeToParcel(Parcel out, int flags) {
     out.writeInt(mData);
 }

 public static final Parcelable.Creator<MyParcelable> CREATOR
         = new Parcelable.Creator<MyParcelable>() {
     public MyParcelable createFromParcel(Parcel in) {
         return new MyParcelable(in);
     }

     public MyParcelable[] newArray(int size) {
         return new MyParcelable[size];
     }
 };

 private MyParcelable(Parcel in) {
     mData = in.readInt();
 }
}

由于该文档是为Java编写的,因此对C#来说基本上是错误的。我只是想知道是否有人知道如何将此代码转换为C#。我在CREATOR领域遇到了麻烦。

此外,由于我正在尝试编写可以在以后移植到其他平台的代码,实现Parcelable的最佳方法是什么?我应该使用部分类使其成为课程的一部分吗?

3 个答案:

答案 0 :(得分:3)

我经常忘记的一件事是匿名内部类(AIC对我而言)是AIC中的'类型'没有直接翻译成C# - 它们是接口,这意味着C#的标准是从'I开始。 “此外,每个AIC必须在c#中明确实现。

以下是否有帮助?

public class Creator : IParcelableCreator
{


    public Java.Lang.Object CreateFromParcel(Parcel source)
    {
        throw new NotImplementedException();
    }

    public Java.Lang.Object[] NewArray(int size)
    {
        throw new NotImplementedException();
    }

    public IntPtr Handle
    {
        get { throw new NotImplementedException(); }
    }
}

然后:

public class MyParcelable : IParcelable
{


    public int DescribeContents()
    {
        throw new NotImplementedException();
    }

    public void WriteToParcel(Parcel dest, int flags)
    {
        throw new NotImplementedException();
    }

    public IntPtr Handle
    {
        get { throw new NotImplementedException(); }
    }
}

答案 1 :(得分:2)

我知道这已经过时了,但我遇到了同样的问题。最后我使用[ExportField(“CREATOR”)]开始工作。

所以我最终得到了

public class MyParcelable : Object, IParcelable
{
    public string MyString { get; set; }

    [ExportField("CREATOR")]
    public static MyParcelableCreator InititalizeCreator()
    {
        return new MyParcelableCreator();
    }

    public MyParcelable(string myString)
    {
        MyString = myString;
    }

    public int DescribeContents()
    {
        return 0;
    }

    public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags)
    {
        dest.WriteString(MyString);
    }

    public class MyParcelableCreator : Object, IParcelableCreator
    {
        public Object CreateFromParcel(Parcel source)
        {
            return new MyParcelable(source.ReadString());
        }

        public Object[] NewArray(int size)
        {
            return new MyParcelable[size];
        }
    }
}

希望这有助于某人

答案 2 :(得分:0)

来自资源Implementing Interfaces

您必须扩展Java.Lang.Object,它可以避免您处理或处置。

public class GroupMetadata : Java.Lang.Object, IParcelable, IComparable<GroupMetadata> {
        public const int REFRESH = -1;
        public int flPos;
        public int lastChildFlPos;
        public int gPos;
        public long gId;

        private GroupMetadata ()
        {

        }

        public static GroupMetadata Obtain(int flPos, int lastChildFlPos, int gPos, long gId) {
            GroupMetadata gm = new GroupMetadata();
            gm.flPos = flPos;
            gm.lastChildFlPos = lastChildFlPos;
            gm.gPos = gPos;
            gm.gId = gId;
            return gm;
        }

        public int CompareTo(GroupMetadata another) {
            if (another == null) {
                throw new InvalidOperationException();
            }

            return gPos - another.gPos;
        }

        public int DescribeContents() {
            return 0;
        }

        public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags) {
            dest.WriteInt(flPos);
            dest.WriteInt(lastChildFlPos);
            dest.WriteInt(gPos);
            dest.WriteLong(gId);
        }

        public static class Creator : Java.Lang.Object, IParcelableCreator
        {
            public static Java.Lang.Object CreateFromParcel(Parcel source)
            {
                GroupMetadata gm = GroupMetadata.Obtain(
                    source.ReadInt(),
                    source.ReadInt(),
                    source.ReadInt(),
                    source.ReadLong());
                return gm;
            }

            public static Java.Lang.Object[] NewArray(int size)
            {
                return new GroupMetadata[size];
            }
        }
    }