【问题标题】:How to demarshall an object from a Xamarin.Android application in an Android Studio application?如何在 Android Studio 应用程序中从 Xamarin.Android 应用程序中解组对象?
【发布时间】:2016-06-01 15:40:36
【问题描述】:

我正在尝试将在 Xamarin 中创建的对象发送到我在 Android Studio 中创建的应用程序。但是,我遇到了 ClassLoader Not Found 的问题。 ClassLoader 肯定是与对象一起发送的(我使用 bundle.SetClassLoader(MyObject.Class.ClassLoader)。我认为问题源于每个平台中的类不同,因为一个是用 Java 编写的,而另一个是用 C# 编写的. 尽管语言不同,如何确保课程相同?

这里是 Java 类:

import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable {
private String firstName;
private String lastName;
private int age;
public int describeContents()
{
    return 0;
}
public void writeToParcel(Parcel dest,int flags)
{
    dest.writeString(firstName);
    dest.writeString(lastName);
    dest.writeInt(age);
}
public String getName()
{
    return firstName +" " + lastName;
}
public int getAge()
{
    return age;
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){
    public Person createFromParcel(Parcel in){
        return new Person(in);
    }
    public Person[] newArray(int size)
    {
        return new Person[size];
    }
};
public Person(Parcel in)
{
    firstName = in.readString();
    lastName = in.readString();
    age = in.readInt();
}

} 这是 C# 类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.Interop;
using Object = Java.Lang.Object;

namespace Greetings.Droid
{
    public class Person : Object,IParcelable 
{
    [ExportField("Creator")]
    public static CREATOR InitializeCreator()
    {
        return new CREATOR();
    }
    public String firstName { get; set; }
    public String lastName { get; set; }
    public int age { get; set; }
    public Person(String firstName, String lastName, int age)
    {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;

    }
    public String getName()
    {
        return firstName + " " + lastName;
    }
    public int getAge()
    {
        return age;
    }

    public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags)
    {
        dest.WriteString(firstName);
        dest.WriteString(lastName);
        dest.WriteInt(age);
    }
    public int DescribeContents()
    {
        return 0;
    }

}


public class CREATOR: Object,IParcelableCreator
{
    public Object CreateFromParcel(Parcel source)
    {
        return new Person(source.ReadString(),   source.ReadString(),source.ReadInt());

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

【问题讨论】:

    标签: java c# android xamarin xamarin.android


    【解决方案1】:

    在 Xamarin 中使用 Register 来设置 parcelable 类的显式名称

    [Register("com.google.xxx.yyy.MyParcelableClass")]
    class MyParcelableClass: Java.Lang.Object, IParcelable
    {
    ...
    }
    

    在java中使用对应的包

    package com.google.xxx.yyy.MyParcelableClass;
    public class MyParcelableClassimplements Parcelable
    {
       ...
    }   
    

    并确保在 proguard 规则中你有

    -dontobfuscate
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2015-07-14
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多