gpt4 book ai didi

android - 新 Activity 的对象序列化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:31 26 4
gpt4 key购买 nike

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

错误如下:

The best overloaded method match for 'Android.Content.Intent.PutExtra(string, Android.OS.Bundle)' has some invalid arguments

Error CS1503: Argument 2: cannot convert from 'SimpleMapDemo.TestObjectToSerialize' to 'Android.OS.Bundle'

这是我用来将对象传递给另一个 Activity 的代码:

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);

在 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();

您可以在此处使用任何类型的序列化。您还可以实现 Java.IO.ISerializable。首先,将 Mono.Android.Export.dll 添加到您的项目引用中。现在,在您的 TestObjectToSerialize 中使用以下代码添加:

使用 Java.Interop;

现在像这样修改你的类:

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();

祝你好运 =)

关于android - 新 Activity 的对象序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21398274/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com