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