Inhaltsverzeichnis
Was ist Serialisierung? In Java ist Serialisierung der Prozess der Konvertierung von Objekten in einen Bytestrom, der in einer Datei gespeichert oder über ein Netzwerk übertragen werden kann. Unter Deserialisierung versteht man den Prozess der Konvertierung eines Bytestroms in ein Rohobjekt. Durch Serialisierung und Deserialisierung können wir Objekte zwischen verschiedenen Anwendungen weitergeben und Objekte zur späteren Verwendung auch in Dateien speichern.
In Java können wir den Serialisierungsmechanismus verwenden, um die Entsprechung zwischen der Codierung und der entsprechenden Bedeutung zu erreichen. Die spezifischen Schritte sind wie folgt:
Heim Java javaLernprogramm So implementieren Sie die Wörterbuchübersetzung elegant in Java

So implementieren Sie die Wörterbuchübersetzung elegant in Java

May 12, 2023 pm 05:31 PM
java

Was ist Serialisierung? In Java ist Serialisierung der Prozess der Konvertierung von Objekten in einen Bytestrom, der in einer Datei gespeichert oder über ein Netzwerk übertragen werden kann. Unter Deserialisierung versteht man den Prozess der Konvertierung eines Bytestroms in ein Rohobjekt. Durch Serialisierung und Deserialisierung können wir Objekte zwischen verschiedenen Anwendungen weitergeben und Objekte zur späteren Verwendung auch in Dateien speichern.

Verwenden Sie die Serialisierung, um die Übersetzung von Wörterbuchwerten zu erreichen.

In Java können wir den Serialisierungsmechanismus verwenden, um die Entsprechung zwischen der Codierung und der entsprechenden Bedeutung zu erreichen. Die spezifischen Schritte sind wie folgt:

1. Definieren Sie eine Wörterbuchanmerkung, zum Beispiel:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DictSerializer.class)
public @interface Dict {

    /**
     * 字典类型
     * 比如在描述学生的时候,1代表小学生 2代表初中生 3代表高中生 4代表大学生
     * 同样在描述老师的时候,1代表语文老师 2代表数学老师 3代表英语老师 4代表体育老师
     * 同样的数值在不同类型下,代表含义不同,所以需要指定字典的类型
     */
    String dic();
}
Nach dem Login kopieren

2. Kombinieren Sie die benutzerdefinierte Annotation mit der Vererbung von ContextualSerializer und realisieren Sie die Übersetzung des zurückgegebenen Ergebnisses:

@Slf4j
public class DictSerializer extends StdSerializer<Object> implements ContextualSerializer {

    private transient String dictCode;

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty beanProperty){
        Dict dict = beanProperty.getAnnotation(Dict.class);
        return createContextual(dict.dic());
    }

    private JsonSerializer<?> createContextual(String dicCode) {
        DictSerializer serializer = new DictSerializer();
        serializer.setDictCode(dicCode);
        return serializer;
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider){

        String dictCode = getDictCode();
        if (StrUtil.isBlank(dictCode)) {
            return;
        }
        if (Objects.isNull(value)) {
            return;
        }
        try {
            // 因为序列化是每个对象都需要进行序列话操作,这里为了减少网络IO,使用了 guava 的本地缓存(代码在下面)
            Map<String, String> dictMap = DictionaryConstants.DICTIONARY_CACHE.get(dictCode);
            if (dictMap.containsKey("nullValue")) {
                // 当本地缓存中不存在该类型的字典时,就调用查询方法,并且放入到本地缓存中(代码在下面)
                dictMap = translateDictValue(dictCode);
                DictionaryConstants.DICTIONARY_CACHE.put(dictCode, dictMap);
            }
            // 通过数据字典类型和value获取name
            String label = dictMap.get(value.toString());
            gen.writeObject(value);
            // 在需要转换的字段上添加@Dict注解,注明需要引用的code,后端会在返回值中增加filedName_dictText的key,前端只需要取对应的 filedName_dictText 就可以直接使用
            gen.writeFieldName(gen.getOutputContext().getCurrentName() + DictionaryConstants.DICT_TEXT_SUFFIX);
            gen.writeObject(label);
        } catch (Exception e) {
            log.error("错误信息:{}", e.getMessage(), e);
        }
    }

    private String getDictCode() {
        return dictCode;
    }

    private void setDictCode(String dictCode) {
        this.dictCode = dictCode;
    }

    protected DictSerializer() {
        super(Object.class);
    }
}
Nach dem Login kopieren

3 Derselbe Wörterbuchtyp und die entsprechende Bedeutung. Speichern Sie es in einer Karte, zum Beispiel:

private Map<String, String> translateDictValue(String code) {
    if (StrUtil.isBlank(code)) {
      return null;
    }
    // Map<String, String> map = new HashMap<>();
    // map.put("1", "小学生");
    // map.put("2", "初中生");
    // map.put("3", "高中生");
    // map.put("4", "大学生");
  
    // 因为我们公司采用微服务,然后字典模块单独拆分成一个服务,所以这里使用Feign方式调用
    DictionaryFeignClient dictionaryFeign = SpringUtil.getBean(DictionaryFeignClient.class);
    return dictionaryFeign.dictionary(code);
}
Nach dem Login kopieren

4 Da bei der Serialisierung jedes Objekt einen Serialisierungsvorgang ausführen muss, werden in diesem Fall viele Serialisierungsvorgänge ausgeführt , derselbe Typ muss sein Das Wörterbuch wird zwischengespeichert. Ich verwende den LoadingCache von guava für das lokale Caching (hier könnte jemand sagen, dass Ihr Cache nicht zu falschen Daten führt, wenn die Bedeutung des Wörterbuchwerts zu diesem Zeitpunkt geändert wird? Erstens). Alle, die Wörterbuchfunktion ist im Allgemeinen Die Verwaltungsseite führt Hinzufügungen, Löschungen und Änderungen durch, und sobald das Wörterbuch festgelegt ist, kann es nicht einfach geändert werden. Wenn Sie hart kämpfen wollen, gewinnen Sie.

public class DictionaryConstants {

    /**
     * 字典翻译文本后缀
     */
    public static final String DICT_TEXT_SUFFIX = "_dictText";

    public static final LoadingCache<String, Map<String, String>> DICTIONARY_CACHE = CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterWrite(30, TimeUnit.SECONDS)
            .expireAfterAccess(10, TimeUnit.SECONDS)
            .build(new CacheLoader<String, Map<String, String>>() {
                @Override
                public Map<String, String> load(String key) {
                    Map<String, String> map = new HashMap<>();
                    map.put("nullValue", "nullValue");
                    return map;
                }
            });
}
Nach dem Login kopieren

Hier noch ein kleiner Hinweis:

    expireAfterWrite und ExpireAfterAccess sind beide Cache-Ablaufstrategien in der Google Guava-Cache-Bibliothek.
  • expireAfterWrite bedeutet, dass das Cache-Element nach der angegebenen Zeit abläuft, unabhängig davon, ob auf das Cache-Element zugegriffen wurde. Wenn wir beispielsweise „expipeAfterWrite“ des Cache-Elements auf 10 Minuten festlegen, läuft das Cache-Element 10 Minuten nach dem Hinzufügen zum Cache ab, unabhängig davon, ob darauf zugegriffen wurde.
  • Diese beiden Ablaufstrategien können einzeln oder in Kombination verwendet werden, um eine flexiblere Caching-Strategie zu erreichen. Beispielsweise können wir „expireAfterWrite“ des Cache-Elements auf 10 Minuten und „expireAfterAccess“ auf 5 Minuten festlegen, sodass das Cache-Element nach 10 Minuten abläuft oder abläuft, wenn in den letzten 5 Minuten nicht darauf zugegriffen wurde, je nachdem, was zuerst eintritt .
  • Verwenden Sie „expireAfterWrite“ und „expireAfterAccess“, um zu vermeiden, dass die Datenablaufzeit im Cache zu lang oder zu kurz wird, und verbessern Sie so die Effizienz und Zuverlässigkeit des Caches.
  • 5. Im Vergleich zur Verwendung der AOP-Aspektmethode kann die Verwendung der Serialisierungsmethode das Wörterbuch besser übersetzen (da es für die AOP-Methode schwierig ist, die Eigenschaften von Attributen in Objekten zu verarbeiten), zum Beispiel:
public class Company {
  private List<Staff> staffs;
}

public class Staff {
  private Integer age;
  private String name;
  @Dic(dic = "position")
  private String position;
  
}
Nach dem Login kopieren

Hier In diesem Szenario Wenn die Unternehmenssammlung zurückgegeben wird, ist es schwierig, den gleichen Effekt (Entwicklungsschwierigkeit und Entwicklungskosten) wie bei der Serialisierungsmethode unter Verwendung der AOP-Aspektmethode zu erzielen.

Durch die oben genannten Schritte können wir den Serialisierungsmechanismus in Java verwenden, um die Entsprechung zwischen der Wörterbuchcodierung und der entsprechenden Bedeutung elegant zu realisieren und so die Verwaltung und Wartung codierter Daten zu vereinfachen.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Wörterbuchübersetzung elegant in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

See all articles