All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.redkale.convert.MapEncoder Maven / Gradle / Ivy

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.redkale.convert;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;

/**
 * Map的序列化操作类
 *
 * 

* 详情见: https://redkale.org * * @author zhangjx * @param Map key的数据类型 * @param Map value的数据类型 */ @SuppressWarnings("unchecked") public class MapEncoder implements Encodeable> { protected final Type type; protected final Encodeable keyencoder; protected final Encodeable valencoder; protected boolean inited = false; protected final Object lock = new Object(); public MapEncoder(final ConvertFactory factory, final Type type) { this.type = type; try { if (type instanceof ParameterizedType) { final Type[] pt = ((ParameterizedType) type).getActualTypeArguments(); this.keyencoder = factory.loadEncoder(pt[0]); this.valencoder = factory.loadEncoder(pt[1]); } else { this.keyencoder = factory.getAnyEncoder(); this.valencoder = factory.getAnyEncoder(); } } finally { inited = true; synchronized (lock) { lock.notifyAll(); } } } @Override public void convertTo(Writer out, Map value) { convertTo(out, null, value); } public void convertTo(Writer out, EnMember member, Map value) { final Map values = value; if (values == null) { out.writeNull(); return; } if (this.keyencoder == null || this.valencoder == null) { if (!this.inited) { synchronized (lock) { try { lock.wait(); } catch (Exception e) { e.printStackTrace(); } } } } if (out.writeMapB(values.size(), (Encodeable) keyencoder, (Encodeable) valencoder, value) < 0) { boolean first = true; for (Map.Entry en : values.entrySet()) { if (!first) out.writeArrayMark(); writeMemberValue(out, member, en.getKey(), en.getValue(),first); if (first) first = false; } } out.writeMapE(); } protected void writeMemberValue(Writer out, EnMember member, K key, V value,boolean first) { keyencoder.convertTo(out, key); out.writeMapMark(); valencoder.convertTo(out, value); } @Override public Type getType() { return type; } public Encodeable getKeyencoder() { return keyencoder; } public Encodeable getValencoder() { return valencoder; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy