Я разобрал кое-какую архитектуру Java и материалы интервью (микросервисы, кластеры, распределенное, промежуточное ПО и т.д.), а друзья, кому нужно, могут обратить внимание на официальный аккаунт [Внутренние дела программиста], и получить самостоятельно без всяких рутин
более предпочтительно
-
Интервьюер немного смутился, сказав 9 распределенных методов генерации ID на одном дыхании.
- Резюме на 30 000 слов, суть оптимизации Mysql
- Чтобы не копировать и не вставлять, я был вынужден изучить краулер JAVA
- Технологический отдел неожиданно объявил, что все разработчики JAVA должны знать фреймворк автоматизации тестирования интерфейсов.
- 5 структур данных Redis и соответствующие им сценарии использования, дополнительные баллы за пленарные интервью
написать впереди
Недавно фанат официального аккаунта болтал со мной о своем опыте собеседования. Новичок, который только что вошел в Java два года назад, из-за эпидемии проходит видеоинтервью, и интервьюер задал всего один вопрос: "Java
Почему реализована сериализация?Serializable
интерфейс? », и в результате он растерялся для интервьюOVER
. Честно говоря, я был немного смущен, когда услышал этот вопрос, обычно я был занят изучением различных промежуточных программ и фреймворков высокой доступности.Java
Серийные знания.
Что такое Java-сериализация?
Сериализация:Java
Механизм сериализации может записывать информацию об объекте экземпляра в поток байтов (Сериализуйте только значения свойств объекта, а не десериализуйте методы.), сериализованный объект можно использовать для передачи по сети или сохранять в базе данных или на диске.
десериализовать: Когда объект необходим, реконструируйте идентичный объект с помощью информации в потоке байтов.
Java
Чтобы сделать класс сериализуемым, реализуйтеjava.io.Serializable
Интерфейс самый простой.
public class User implements Serializable {
private static final long serialVersionUID = 1L;
}
Итак, давайте посмотримSerializable
Исходный код реализации интерфейса вы можете посмотретьSerializable
В интерфейсе нет методов или полей.Этот интерфейс используется только для определения сериализуемой семантики, то есть он используется только для определения возможности сериализации объекта.
package java.io;
/**
* @author unascribed
* @see java.io.ObjectOutputStream
* @see java.io.ObjectInputStream
* @see java.io.ObjectOutput
* @see java.io.ObjectInput
* @see java.io.Externalizable
* @since JDK1.1
*/
public interface Serializable {
}
Далее напишем пример записи информации об объекте на диск для проверки:
СоздаватьUser
объект и реализоватьSerializable
интерфейс
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String age;
}
будетUser
Информация об объекте записывается на диск
@Slf4j
public class serializeTest {
public static void main(String[] args) throws Exception {
User user = new User();
user.setName("fufu");
user.setAge("18");
serialize(user);
log.info("Java序列化前的结果:{} ", user);
User duser = deserialize();
log.info("Java反序列化的结果:{} ", duser);
}
/**
* @author xzf
* @description 序列化
* @date 2020/2/22 19:34
*/
private static void serialize(User user) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("D:\\111.txt")));
oos.writeObject(user);
oos.close();
}
/**
* @author xzf
* @description 反序列化
* @date 2020/2/22 19:34
*/
private static User deserialize() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("D:\\111.txt")));
return (User) ois.readObject();
}
}
序列化前的结果: User(name=fufu, age=18)
反序列化后的结果: User(name=fufu, age=18)
ОткрытымwriteObject
Посмотрите исходный код метода и обнаружите, что в методе есть такая логика, когда записываемый объектString
,Array
,Enum
,Serializable
Объекты типа могут быть сериализованы нормально, в противном случае он выдастNotSerializableException
аномальный.
Это объясняет, почему должна быть реализована сериализация Java.Serializable
интерфейс.
/**
* Underlying writeObject/writeUnshared implementation.
*/
private void writeObject0(Object obj, boolean unshared)
throws IOException
{
boolean oldMode = bout.setBlockDataMode(false);
depth++;
try {
// 省略号。。。。。。。。。。
// remaining cases
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
} finally {
depth--;
bout.setBlockDataMode(oldMode);
}
}
Тогда могут быть сомнения,String
Почему бы не реализоватьSerializable
Что насчет интерфейса? фактическиString
был реализован внутриSerializable
, без повторного показа реализации. Просто посмотрите исходный код
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
......
}
С тех пор, как это было реализованоSerializable
интерфейс, почему вы хотите указатьserialVersionUID
значение ?
Потому что при сериализации объекта, если настройка не отображаетсяserialVersionUID
, Java автоматически сгенерируетserialVersionUID
, а затем сохраните его или используйте для передачи по сети.
При десериализации он автоматически сгенерирует новый на основе свойств объекта.serialVersionUID
, и генерируется при сериализацииserialVersionUID
для сравнения, дваserialVersionUID
Если то же самое, десериализация прошла успешно, иначе будет выброшено исключение.
И когда отображаемые настройкиserialVersionUID
После этого, когда Java сериализует и десериализует объекты, сгенерированныйserialVersionUID
все готово для насserialVersionUID
, что обеспечивает успех десериализации.
transient
При сериализации объекта, если вы хотите, чтобы свойство не сериализовалось, используйтеtransient
изменение ключевого слова
@Data
public class User implements Serializable {
private transient String name;
private String age;
}
могут видеть поляname
Значение не сохраняется на диск после того, как переменнаяtransient
Измененная переменная больше не будет частью постоянства объекта, и доступ к содержимому переменной после сериализации будет невозможен.
Java序列化前的结果: User(name=fufu, age=18)
Java反序列化的结果:User(name=null, age=18)
Статическая переменная независимо от того, является ли онаtransient
Модификации не могут быть сериализованы. так какstatic
Декорированные свойства принадлежат классу, а не объекту.
Суммировать
Поделился небольшим знанием, не забывайте об этом, как бы вы ни были занятыУчитесь у прошлого!
Так много, что нужно сказать сегодня, если эта статья была вам полезна, я надеюсь получить от вас лайк 👍
Ваше одобрение является движущей силой для моего письма!