Android 新活动的对象序列化

Android 新活动的对象序列化,android,serialization,android-activity,xamarin,bundle,Android,Serialization,Android Activity,Xamarin,Bundle,我正在用Xamarin编码,我需要将一个对象传递给另一个活动,但是我在将该对象转换为“Android.OS.Bundle”时遇到了一个错误 以下是错误: 与“Android.Content.Intent.PutExtra(string,Android.OS.Bundle)”匹配的最佳重载方法具有一些无效参数 错误CS1503:参数2:无法从转换 将“SimpleMapDemo.TestObjectToSerialize”改为“Android.OS.Bundle” 下面是我用来将对象传递给另一个活

我正在用Xamarin编码,我需要将一个对象传递给另一个活动,但是我在将该对象转换为“Android.OS.Bundle”时遇到了一个错误

以下是错误:

与“Android.Content.Intent.PutExtra(string,Android.OS.Bundle)”匹配的最佳重载方法具有一些无效参数

错误CS1503:参数2:无法从转换 将“SimpleMapDemo.TestObjectToSerialize”改为“Android.OS.Bundle”

下面是我用来将对象传递给另一个活动的代码:

TestObjectToSerialize testObjectToSerialize;
testObjectToSerialize.testString = "objectToSerialize";
Intent intent = new Intent (this.ApplicationContext, typeof(HomeScreen));
intent.PutExtra("objectToSerialize", testObjectToSerialize);
下面是课堂:

[Serializable]
class TestObjectToSerialize
{
    public string testString{ set; get;}
}
我能帮点忙让代码正常工作吗


提前感谢

您有很多方法可以做到这一点。首先,我建议不要将对象作为额外对象传递。相反,您可以使用“单例模式”-只需使用您想要传递的相同类型的静态属性定义静态类,并将传递对象分配给此静态属性即可。 但是,如果确实需要将其作为额外对象传递,则可以使用序列化并序列化到任何类型的对象。这里是一个快速示例(注意,为了简化示例,我没有关闭流,也没有进行代码重用-这只是一个示例,因此您可以理解其原理)。 在某个按钮点击事件的“MainActivity”中,我添加了以下代码:

var testObj = new TestObjectToSerialize();
testObj.testString = "testString";
var formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, testObj);

var secondActivity = new Intent(this, typeof(SecondActivity));
secondActivity.PutExtra("testObj", stream.ToArray());
StartActivity(secondActivity);
在第二个活动中,我收到的额外信息如下:

var byteArr = Intent.GetByteArrayExtra("testObj");
var stream = new MemoryStream(byteArr);
var formatter = new BinaryFormatter();
var testObj = formatter.Deserialize(stream) as TestObjectToSerialize;

Toast.MakeText(this, testObj.testString, ToastLength.Long).Show();
public class TestObjectToSerialize : Java.Lang.Object, Java.IO.ISerializable
{
    public string testString { set; get; }

    //The magic starts here

    public TestObjectToSerialize()
    {
        Console.WriteLine("TestObjectToSerialize..ctor");
    }

    //You have to make this one
    public TestObjectToSerialize(IntPtr handle, JniHandleOwnership transfer)
        : base(handle, transfer)
    {
        Console.WriteLine("TestObjectToSerialize..ctor(IntPtr, JniHandleOwnership)");
    }

    [Export("readObject", Throws = new[] {
    typeof (Java.IO.IOException),
    typeof (Java.Lang.ClassNotFoundException)})]
    private void ReadObjectDummy(Java.IO.ObjectInputStream source)
    {
        testString = ReadNullableString(source);
    }

    [Export("writeObject", Throws = new[] {
    typeof (Java.IO.IOException),
    typeof (Java.Lang.ClassNotFoundException)})]
    private void WriteObjectDummy(Java.IO.ObjectOutputStream destination)
    {
        WriteNullableString(destination, testString);
    }

    static void WriteNullableString(Java.IO.ObjectOutputStream dest, string value)
    {
        dest.WriteBoolean(value != null);
        if (value != null)
            dest.WriteUTF(value);
    }

    static string ReadNullableString(Java.IO.ObjectInputStream source)
    {
        if (source.ReadBoolean())
            return source.ReadUTF();
        return null;
    }
}
您可以在这里使用任何类型的序列化。您还可以实现
Java.IO.ISerializable
。 首先,将
Mono.Android.Export.dll
添加到项目引用中。现在,在您的
TestObjectToSerialize
中,使用以下方法添加此项:

使用Java.Interop

现在按如下方式修改您的类:

var byteArr = Intent.GetByteArrayExtra("testObj");
var stream = new MemoryStream(byteArr);
var formatter = new BinaryFormatter();
var testObj = formatter.Deserialize(stream) as TestObjectToSerialize;

Toast.MakeText(this, testObj.testString, ToastLength.Long).Show();
public class TestObjectToSerialize : Java.Lang.Object, Java.IO.ISerializable
{
    public string testString { set; get; }

    //The magic starts here

    public TestObjectToSerialize()
    {
        Console.WriteLine("TestObjectToSerialize..ctor");
    }

    //You have to make this one
    public TestObjectToSerialize(IntPtr handle, JniHandleOwnership transfer)
        : base(handle, transfer)
    {
        Console.WriteLine("TestObjectToSerialize..ctor(IntPtr, JniHandleOwnership)");
    }

    [Export("readObject", Throws = new[] {
    typeof (Java.IO.IOException),
    typeof (Java.Lang.ClassNotFoundException)})]
    private void ReadObjectDummy(Java.IO.ObjectInputStream source)
    {
        testString = ReadNullableString(source);
    }

    [Export("writeObject", Throws = new[] {
    typeof (Java.IO.IOException),
    typeof (Java.Lang.ClassNotFoundException)})]
    private void WriteObjectDummy(Java.IO.ObjectOutputStream destination)
    {
        WriteNullableString(destination, testString);
    }

    static void WriteNullableString(Java.IO.ObjectOutputStream dest, string value)
    {
        dest.WriteBoolean(value != null);
        if (value != null)
            dest.WriteUTF(value);
    }

    static string ReadNullableString(Java.IO.ObjectInputStream source)
    {
        if (source.ReadBoolean())
            return source.ReadUTF();
        return null;
    }
}
现在,在
MainActivity
中,您可以执行以下操作:

var testObj = new TestObjectToSerialize();
testObj.testString = "testString";

var secondActivity = new Intent(this, typeof(SecondActivity));
secondActivity.PutExtra("testObj", testObj);
StartActivity(secondActivity);
SecondActivity
中:

var testObj = Intent.GetSerializableExtra("testObj") as TestObjectToSerialize;
Toast.MakeText(this, testObj.testString, ToastLength.Long).Show();
好运=)