загружать данные из файла в другой пакет в java [duplicate]

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

Этот оператор:

a = [1,2,3]

означает присвоение списку (объекту) имени a, и это:

b = a

просто дает тому же объекту a новое имя b, поэтому всякий раз, когда вы что-то делаете с a, объект изменяется, и поэтому b изменяется .

Единственный способ сделать действительно копию a для создания нового объекта, как и другие ответы, уже сказал.

Вы можете увидеть больше об этом здесь .

3
задан matthiasboesinger 30 September 2014 в 17:35
поделиться

2 ответа

Мое первое предложение - сделать вашу реализацию простой и прекратить борьбу с каркасом - использовать те же имена пакетов для всех приложений. Я хотел бы предложить сделать библиотеку из сериализуемых классов и поделиться ею между реализациями.

Если вы ДОЛЖНЫ сериализоваться / десериализоваться в приложениях с разными именами пакетов, тогда мое предложение состояло в том, чтобы отказаться от встроенного Сериализация Java, которая тесно связана с именем класса и именем пакета, и использовать что-то вроде Gson для сериализации / десериализации.

Gson позволяет вам указать TypeAdaper. Вы можете создавать и регистрировать TypeAdapter для каждого класса, который вы будете сериализовать / десериализовать, и указать имя класса (без имени пакета) как «тип» при сериализации, как в следующем примере, но использовать getSimpleName () вместо getCanonicalName ( )

При десериализации вы должны добавить правильное имя пакета в «type»

. Вам нужно будет делать TypeAdapters отдельно для каждого приложения.

public class GsonTypeAdapter<T> implements JsonSerializer<T>, JsonDeserializer<T> {
    @Override
    public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject result = new JsonObject();
        result.add("type", new JsonPrimitive(src.getClass().getCanonicalName()));
        result.add("properties", context.serialize(src, src.getClass()));

        return result;
    }

    @Override
    public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
        throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        String type = jsonObject.get("type").getAsString();
        JsonElement element = jsonObject.get("properties");

        try {
            return context.deserialize(element, Class.forName(type));
        } catch (ClassNotFoundException cnfe) {
            throw new JsonParseException("Unknown element type: " + type, cnfe);
        }
    }
}
5
ответ дан GreyBeardedGeek 21 August 2018 в 14:45
поделиться

Имя пакета для класса является фундаментальной частью его полного имени.

, если matthiasboesinger - имя ура, тогда matthias - это просто имя пользователя ur, чтобы идентифицировать вас, но часть босинга - это ваше уникальное имя идентификатор.

аналогично, в классах компилятор идентифицирует класс и их сериализованные объекты с их полным именем, а не только с первым именем.

в случае, если вы меняете имена пакетов, u потерять целостность класса, поскольку разные классы могут существовать в разных пакетах с таким же именем.

, так что вы пытаетесь, невозможно.

, если вы не напишете класс адаптера, который поднимает данные из исходного класса с именем пакета и накачивают данные в новый класс имени пакета.

, но это просто избиение вокруг куста.

0
ответ дан Fr_nkenstien 21 August 2018 в 14:45
поделиться
  • 1
    Мой вопрос: почему перезаписанный метод readClassDescriptor не может решить описанную проблему. то есть: что первоначальный класс больше не доступен для jvm под его первоначальным именем ... – matthiasboesinger 30 September 2014 в 17:29
Другие вопросы по тегам:

Похожие вопросы: