1、
序列化主要在zookeeper.jute包中,其中涉及的主要接口如下
- InputArchive
- OutputArchive
- Index
- Record
InputArchive
(其是所有反序列化器都需要实现的接口,主要把八种数据类型和其他属性,比如对象等序列化,转换成字节,进行传递)
// 读取byte类型
public byte readByte(String tag) throws IOException;
BinaryInputArchive(InputArchive的一种实现)
// DataInput接口,用于从二进制流中读取字节
private DataInput in;
// 静态方法,用于获取Archive
static public BinaryInputArchive getArchive(InputStream strm) { return new BinaryInputArchive(new DataInputStream(strm)); }
// 读取字节 public byte readByte(String tag) throws IOException { return in.readByte(); }
CsvInputArchive(InputArchive的一种实现)
// 推回字节流 private PushbackReader stream;
// 构造函数 public CsvInputArchive(InputStream in) throws UnsupportedEncodingException { // 初始化stream属性 stream = new PushbackReader(new InputStreamReader(in, "UTF-8")); }
// 读取byte类型
public byte readByte(String tag) throws IOException { return (byte) readLong(tag); }
XmlInputArchive
(InputArchive的一种实现)这是一种自己写解析的
// 内部类,XML解析器
private static class XMLParser extends DefaultHandler { private boolean charsValid = false; private ArrayList<Value> valList; private XMLParser(ArrayList<Value> vlist) { valList = vlist; } // 文档开始,空的实现 public void startDocument() throws SAXException {} // 文档结束,空的实现 public void endDocument() throws SAXException {} // 开始解析元素 public void startElement(String ns, String sname, String qname, Attributes attrs) throws SAXException { // charsValid = false; if ("boolean".equals(qname) || // boolean类型 "i4".equals(qname) || // 四个字节 "int".equals(qname) || // int类型 "string".equals(qname) || // String类型 "double".equals(qname) || // double类型 "ex:i1".equals(qname) || // 一个字节 "ex:i8".equals(qname) || // 八个字节 "ex:float".equals(qname)) { // 基本类型 // charsValid = true; // 添加至列表 valList.add(new Value(qname)); } else if ("struct".equals(qname) || "array".equals(