如果我们需要往memcached中存储非基本类型的Object时

是需要对这个Object进行序列化的

不过,现在的memcached client都已经替你做了序列化和反序列化工作了

所以,我们在使用时,可以直接把Object传给它,让它来实现序列化和反序列化



比如,python的Client工具memcache.py中



折叠复制代码




  1. flags=0

  2. if isinstance(val, str):

  3. pass

  4. elif isinstance(val, int):

  5. flags |= Client._FLAG_INTEGER

  6. val="%d"% val

  7. # force no attempt to compress this silly string.

  8. min_compress_len=0

  9. elif isinstance(val, long):

  10. flags |= Client._FLAG_LONG

  11. val="%d"% val

  12. # force no attempt to compress this silly string.

  13. min_compress_len=0

  14. else:

  15. flags |= Client._FLAG_PICKLE

  16. file=StringIO()

  17. pickler=self.pickler(file,protocol=self.pickleProtocol)

  18. if self.persistent_id:

  19. pickler.persistent_id=self.persistent_id

  20. pickler.dump(val)

  21. val=file.getvalue()




可以看到,对于复杂的Object,它默认是调用cPickle来作为其序列化的工具的

当然,我们也可以在set之前,也可以使用marshal或其它的工具来自行序列化



java的spymemcached的Client库

 



折叠复制代码




  1. byte[]b=null;

  2. intflags=0;

  3. if(o instanceof String) {

  4. b=encodeString((String)o);

  5. } else if(o instanceof Long) {

  6. b=tu.encodeLong((Long)o);

  7. flags |= SPECIAL_LONG;

  8. .....

  9. } else {

  10. b=serialize(o);

  11. flags |= SERIALIZED;

  12. }




最后,它调用了serialize方法进行序列化的,再看serialize方法

 



折叠复制代码




  1. ByteArrayOutputStreambos=newByteArrayOutputStream();

  2. ObjectOutputStreamos=newObjectOutputStream(bos);

  3. os.writeObject(o);

  4. os.close();

  5. bos.close();




Java的另外一个memcached client:java_memcached-release_2.0.1中是用URLEncoder进行了编码处理



折叠复制代码




  1. private String sanitizeKey( String key ) throws UnsupportedEncodingException    

  2. {   

  3.     return ( sanitizeKeys ) ? URLEncoder.encode( key, "UTF-8" ) : key;   

  4. }  






由于不同的Client实现的序列化方式不同,所以如果在不同的语言


如,java,python中使用同一个memcached来存取数据,可能会造成数据不一致的问题