Nano Hash - криптовалюты, майнинг, программирование

Parcelable кодировщик/декодер (внешний класс)

У меня есть внешняя библиотека Java с множеством общих объектов (например, пользователь с именем, фамилией, адресом...). То, что я хочу создать, — это класс (де) сериализатора, который преобразует все мои объекты в объекты Parcelable для отправки с намерениями. Проблема в том, что намерения Android не поддерживают putExtra(String,Parcel) или что-то подобное. У вас есть идея, как преодолеть это неудобство? На самом деле я помещаю все свои экземпляры в класс Application, но я думаю, что это грязный метод... более чистый?


  • Создайте класс модели, поместите в него все необходимые данные и сделайте его разделяемым. В строке заметки по умолчанию сериализуется, взгляните на класс String для Android. 17.02.2014
  • У меня просто есть (де)сериализатор Json, но эффективен ли он? Мне нравится всегда иметь чистые решения... Проблема в том, что я получаю эти объекты через JSon, поэтому у меня есть User user = json.decode(string); Теперь я хочу отправить его ParcelableUser puser = (ParcelableUser) user; Но теперь я не могу использовать это приведение из-за ограничений Java на приведение подклассов. 17.02.2014
  • u сделать этот класс пользователя разделяемым, в Android это так называемое чистое решение 17.02.2014

Ответы:


1

Вы можете использовать putExtras (расширение пакета) Intent и реализуйте в своем классе метод exportToBundle(), который возвращает Bundle со значениями этого объекта. Если вы не хотите создавать какие-либо другие методы в своем классе, вы можете создать другой служебный класс со статическим методом, который преобразует объект вашего класса в Bundle. И если ваш класс Parcelable, вы можете поместить его прямо в Bundle, используя метод putParcelable(String key, Parcelable value).

17.02.2014

2

Вы можете напрямую поместить класс Parcelable в намерение, чтобы то, что вы ищете, поддерживалось. Здесь есть слово предупреждения, и я думаю, что вы уже поняли эту концепцию, упомянув сериализацию/десериализацию. Вы отправляете копию класса, которая будет реконструирована классом, обрабатывающим намерение. Официальный пример Android слаб, поскольку отправляется только одно целое число, а мы уже можем это сделать.

Пример намерения передать класс

        Intent intent = new Intent(context, TheClassImCalling.class);
            // use a constant that's public or an R string so both the sender
            // and receiver are working on the same class
            // the class you are sending goes into the putExtra method statement.
    intent.putExtra(ImageTextListViewActivity.EXTRA_KMLSUMMARY,
    mKmlSummary);
    startActivity(intent);

Вы вытаскиваете копию из класса с помощью такого оператора, используя ту же константу, которую вы использовали для ее отправки.

KMLSummary mkmlSummary = intent.getExtras().getParcelable(
                ImageTextListViewActivity.EXTRA_KMLSUMMARY);

Вот методы, которые должны быть реализованы

public class KmlSummary implements Parcelable {

// конструктор с Parcel в качестве аргумента. // вы читаете и записываете значения в одном и том же порядке.

public KmlSummary(Parcel in) {
    this._id = in.readInt();
    this._description = in.readString();
    this._name = in.readString();
    this.set_bounds(in.readDouble(), in.readDouble(), in.readDouble(),
            in.readDouble());
    this._resrawid = in.readInt();
    this._resdrawableid = in.readInt();
    this._pathstring = in.readString();
    String s = in.readString();
    this.set_isThumbCreated(Boolean.parseBoolean(s));
}


// Overridden methods for the Parseable interface.
@Override
 public void writeToParcel(Parcel arg0, int arg1) {
    arg0.writeInt(this._id);
    arg0.writeString(this._description);
    arg0.writeString(this._name);
     arg0.writeDouble(this.get_bounds().southwest.latitude);
    arg0.writeDouble(this.get_bounds().southwest.longitude);
     arg0.writeDouble(this.get_bounds().northeast.latitude);
    arg0.writeDouble(this.get_bounds().northeast.longitude);
     arg0.writeInt(this._resrawid);
    arg0.writeInt(this._resdrawableid);
     arg0.writeString(this.get_pathstring());
    String s = Boolean.toString(this.isThumbCreated());
     arg0.writeString(s);
 }

@Override
 public int describeContents() {
    //
     return 0;
 }


    // Some glue to tell the OS how to create the class from the parcel
@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
     public KmlSummary createFromParcel(Parcel in) {
        return new KmlSummary(in);
     }

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

Вот и все, вы можете сериализовать класс в намерение и десериализовать класс из намерения.

Удачи Дэнни117

17.02.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..