java redis 反序列化_【Java】反序列化在C#中保存到Redis的数据

因为两个项目公用的Redis缓存,获取在C#中保存的数据时反序列化出错.C#中保存的获取的数据取出来后如下:

```js

{"Guid":"ee7a6e30cf98497b9906e25790b03485","Serial":300,"CreateDate":"\/Date(1423292741000-0000)\/","IsOpen":false}

```

`Guid`中没有中间的横线[-],日期类型的格式也比较奇怪.于是使用`Jackson`的自定义序列化及反序列化,使Java和C#保存到Redis中的数据保持一致.

#### Guid的反序列化类(`GuidDeserializer`):

```java

import org.codehaus.jackson.JsonParser;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.map.DeserializationContext;

import org.codehaus.jackson.map.JsonDeserializer;

import java.io.IOException;

/**

* Created by liujiajia on 2017/2/20.

*/

public class GuidDeserializer extends JsonDeserializer {

@Override

public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

byte[] newGuid = new byte[36];

byte[] oldGuid = jsonParser.getText().getBytes();

int j = 0;

for (int i = 0; i < newGuid.length; i++) {

if (i == 8 || i == 13 || i == 18 || i == 23) {

newGuid[i] = '-';

} else {

newGuid[i] = oldGuid[j];

j++;

}

}

return new String(newGuid);

}

}

```

#### 日期类型的反序列化类(`DateDeserializer`):

```java

import org.apache.commons.httpclient.util.DateUtil;

import org.codehaus.jackson.JsonParser;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.map.DeserializationContext;

import org.codehaus.jackson.map.JsonDeserializer;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.TimeZone;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

* Created by liujiajia on 2017/2/20.

*/

public class DateDeserializer extends JsonDeserializer {

@Override

public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {

String strDate = jsonParser.getText();

Pattern p = Pattern.compile("\\/Date\\((\\d{13})-(\\d{4})\\)\\/");

Matcher m = p.matcher(strDate);

while (m.find()) {

Date date = new Date(Long.parseLong(m.group(1)));

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

return sdf.format(date);

}

return strDate;

}

}

```

#### Guid序列化的类(`GuidNoBarSerializer`):

```java

import org.codehaus.jackson.JsonGenerator;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.map.JsonSerializer;

import org.codehaus.jackson.map.SerializerProvider;

import java.io.IOException;

/**

* Created by liujiajia on 2017/2/20.

*/

public class GuidNoBarSerializer extends JsonSerializer {

@Override

public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

jsonGenerator.writeString(s.toLowerCase().replace("-", ""));

}

}

```

#### 日期类型的序列化类(`DateSerializer`):

```java

import org.codehaus.jackson.JsonGenerator;

import org.codehaus.jackson.JsonProcessingException;

import org.codehaus.jackson.map.JsonSerializer;

import org.codehaus.jackson.map.SerializerProvider;

import java.io.IOException;

import java.text.DateFormat;

import java.text.ParseException;

import java.util.Date;

/**

* Created by liujiajia on 2017/2/20.

*/

public class DateSerializer extends JsonSerializer {

@Override

public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

try {

Date date = DateFormat.getDateTimeInstance().parse(s);

jsonGenerator.writeString("/Date(" + String.valueOf(date.getTime()) + "-0000)/");

} catch (ParseException e) {

jsonGenerator.writeString(s);

}

}

}

```

模型中使用上面的自定义标注(因为java中的字段一般是小写开头的,所以还要加上`JsonProperty`标注,使字段名和C#中的属性名匹配):

```java

/**

* ID

*/

@JsonProperty("Guid")

@JsonSerialize(using = GuidNoBarSerializer.class)

@JsonDeserialize(using = GuidDeserializer.class)

private String guid;

/**

* 创建时间

*/

@JsonProperty("CreateDate")

@JsonSerialize(using = DateSerializer.class)

@JsonDeserialize(using = DateDeserializer.class)

private String createDate;

```

从Redis中获取时的代码:

```java

public static boolean setJsonObjectKey(String key, Object value) {

try (Jedis jedis = getRedisUtils().getMasterJedisPool().getResource())

{

jedis.set(key, new ObjectMapper().writeValueAsString(value));

jedis.expire(key.getBytes(), _default_expire_secondes);

return true;

} catch (Exception ex) {

return false;

}

}

public static T getJsonObjectValue(String key, Class clazz) {

try (Jedis jedis = getRedisUtils().getSlaveJedisPool().getResource())

{

String json = jedis.get(key);

return new ObjectMapper().readValue(json, clazz);

} catch (Exception ex) {

return null;

}

}

public static T getJsonObjectValue(String key, TypeReference valueTypeRef) {

try (Jedis jedis = getRedisUtils().getSlaveJedisPool().getResource())

{

String json = jedis.get(key);

return new ObjectMapper().readValue(json, valueTypeRef);

} catch (Exception ex) {

return null;

}

}

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值