В отличие от других языков, имеющих переменную и значение, у Python есть имя и объект.
Этот оператор:
a = [1,2,3]
означает присвоение списку (объекту) имени a
, и это:
b = a
просто дает тому же объекту a
новое имя b
, поэтому всякий раз, когда вы что-то делаете с a
, объект изменяется, и поэтому b
изменяется .
Единственный способ сделать действительно копию a для создания нового объекта, как и другие ответы, уже сказал.
Вы можете увидеть больше об этом здесь .
Мое первое предложение - сделать вашу реализацию простой и прекратить борьбу с каркасом - использовать те же имена пакетов для всех приложений. Я хотел бы предложить сделать библиотеку из сериализуемых классов и поделиться ею между реализациями.
Если вы ДОЛЖНЫ сериализоваться / десериализоваться в приложениях с разными именами пакетов, тогда мое предложение состояло в том, чтобы отказаться от встроенного Сериализация 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);
}
}
}
Имя пакета для класса является фундаментальной частью его полного имени.
, если matthiasboesinger - имя ура, тогда matthias - это просто имя пользователя ur, чтобы идентифицировать вас, но часть босинга - это ваше уникальное имя идентификатор.
аналогично, в классах компилятор идентифицирует класс и их сериализованные объекты с их полным именем, а не только с первым именем.
в случае, если вы меняете имена пакетов, u потерять целостность класса, поскольку разные классы могут существовать в разных пакетах с таким же именем.
, так что вы пытаетесь, невозможно.
, если вы не напишете класс адаптера, который поднимает данные из исходного класса с именем пакета и накачивают данные в новый класс имени пакета.
, но это просто избиение вокруг куста.