Rumah > Java > javaTutorial > teks badan

Bagaimana untuk melaksanakan terjemahan kamus di Jawa dengan elegan

PHPz
Lepaskan: 2023-05-12 17:31:06
ke hadapan
1447 orang telah melayarinya

Apakah itu Serialisasi

Dalam Java, siri ialah proses menukar objek kepada aliran bait yang boleh disimpan ke fail atau dihantar melalui rangkaian. Penyahserialisasian ialah proses menukar aliran bait kepada objek mentah. Melalui pensirilan dan penyahserikatan, kami boleh menghantar objek antara aplikasi yang berbeza dan juga menyimpan objek ke fail untuk kegunaan kemudian.

Gunakan bersiri untuk merealisasikan terjemahan nilai kamus

Di Jawa, kita boleh menggunakan mekanisme bersiri untuk merealisasikan kesesuaian antara pengekodan dan makna yang sepadan dengannya. Langkah-langkah khusus adalah seperti berikut:

1 Tentukan anotasi kamus, contohnya:

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

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

2. Sesuaikan anotasi dan warisi JsonSerialize untuk melaksanakan ContextualSerializer, dan nyatakan terjemahan hasil yang dikembalikan :

@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);
    }
}
Salin selepas log masuk

3. Simpan kod kamus dan makna yang sepadan daripada jenis yang sama ke dalam Peta, contohnya:

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);
}
Salin selepas log masuk

4. Kerana penyirian memerlukan setiap objek melakukan operasi jujukan, jika koleksi dikembalikan, Banyak operasi bersiri akan dilakukan Pada masa ini, kamus jenis yang sama perlu dicache saya menggunakan LoadingCache jambu untuk caching tempatan (seseorang mungkin mengatakan di sini bahawa jika makna nilai kamus diubah pada masa ini. Bukankah cache anda akan membawa kepada data yang salah? Pertama sekali, fungsi kamus biasanya ditambah, dipadam dan diubah suai oleh pihak pengurusan, dan sebaik sahaja kamus ditetapkan, ia tidak akan mudah diubah suai berjuang, anda menang).

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;
                }
            });
}
Salin selepas log masuk

Berikut adalah sedikit pengetahuan tambahan:

  • expireAfterWrite dan expireAfterAccess ialah kedua-dua strategi tamat tempoh cache dalam pustaka cache Google Guava.

  • expireAfterWrite menunjukkan bahawa item cache tamat tempoh selepas masa yang ditentukan, tidak kira sama ada item cache telah diakses. Contohnya, jika kami menetapkan item cache expireAfterWrite kepada 10 minit, item cache akan tamat tempoh 10 minit selepas ia ditambahkan pada cache, tidak kira sama ada ia telah diakses.

  • Kedua-dua strategi tamat tempoh ini boleh digunakan secara bersendirian atau digabungkan untuk mencapai strategi caching yang lebih fleksibel. Sebagai contoh, kita boleh menetapkan item cache expireAfterWrite kepada 10 minit dan juga menetapkan expireAfterAccess kepada 5 minit, supaya item cache akan tamat tempoh selepas 10 minit, atau tamat tempoh apabila ia tidak diakses dalam 5 minit terakhir, yang mana dahulu. .

  • Menggunakan expireAfterWrite dan expireAfterAccess boleh mengelakkan masa tamat tempoh data dalam cache terlalu lama atau terlalu pendek, sekali gus meningkatkan kecekapan dan kebolehpercayaan cache.

5 Berbanding dengan menggunakan aspek aop, menggunakan serialisasi boleh menterjemah kamus dengan lebih baik (kerana sukar untuk aop mengendalikan atribut objek), contohnya:

rreee<.>Dalam senario ini, jika koleksi Syarikat dikembalikan, ia akan menjadi sukar untuk mencapai kesan yang sama (kesukaran pembangunan dan kos pembangunan) seperti kaedah bersiri menggunakan kaedah aspek aop.

Melalui langkah di atas, kami boleh menggunakan mekanisme bersiri dalam Java untuk merealisasikan secara elegan kesesuaian antara pengekodan kamus dan makna yang sepadan, dengan itu memudahkan pengurusan dan penyelenggaraan data yang dikodkan.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan terjemahan kamus di Jawa dengan elegan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan