Middle
Cum trebuie să procedați dacă trebuie să serializați un obiect al clasei dvs., dar unul dintre câmpurile sale nu poate fi serializat?
sobes.tech AI
Răspuns de la AI
Использовать аннотации для исключения поля из сериализации:
@Transient: Для Java Bean (например, при использованииjava.io.Serializable).@Transient: Для Kotlin (например, при использованииjava.io.Serializable).@kotlin.jvm.Transient: Для Kotlin, чтобы поле игнорировалось Java сериализацией.@IgnoredOnParcel: Для Kotin при использованииParcelable.@JsonIgnore: Для Jackson.@kotlinx.serialization.Transient: Дляkotlinx.serialization.- Добавить ключевое слово
transient(для Java).
Пример с transient в Java:
class SerializableObject implements Serializable {
private String serializableField;
private transient NonSerializableType nonSerializableField; // Исключаем из сериализации
}
Пример с @Transient в Kotlin:
import java.io.Serializable
class SerializableObject(
val serializableField: String,
@Transient val nonSerializableField: NonSerializableType // Исключаем из сериализации
) : Serializable
Пример с @IgnoredOnParcel в Kotlin:
import android.os.Parcelable
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
class ParcelableObject(
val serializableField: String,
@IgnoredOnParcel val nonSerializableField: NonSerializableType // Исключаем из сериализации
) : Parcelable
Альтернативный подход для java.io.Serializable в Java/Kotlin - реализовать свои методы writeObject и readObject и вручную контролировать, какие поля сериализуются.
class CustomSerializableObject implements Serializable {
private String serializableField;
private NonSerializableType nonSerializableField; // Сериализуем вручную
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // Сериализуем остальные поля
out.writeObject(nonSerializableField.toSerializableRepresentation()); // Сериализуем несериализуемое поле
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // Десериализуем остальные поля
nonSerializableField = NonSerializableType.fromSerializableRepresentation(in.readObject()); // Десериализуем несериализуемое поле
}
}
class NonSerializableType {
// Методы для преобразования в и из сериализуемого формата
public Serializable toSerializableRepresentation() { ... }
public static NonSerializableType fromSerializableRepresentation(Object obj) { ... }
}