zookeeper的jute包,序列化

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(qname)) { // 结构体或数组类型 // 添加至列表 valList.add(new Value(qname)); } } // 结束解析元素 public void endElement(String ns, String sname, String qname) throws SAXException { charsValid = false; if ("struct".equals(qname) || "array".equals(qname)) { // 结构体或数组类型 // 添加至列表 valList.add(new Value("/"+qname)); } } public void characters(char buf[], int offset, int len) throws SAXException { if (charsValid) { // 是否合法 // 从列表获取value Value v = valList.get(valList.size()-1); // 将buf添加至value v.addChars(buf, offset,len); } } }
// 构造函数 public XmlInputArchive(InputStream in) throws ParserConfigurationException, SAXException, IOException { // 初始化XmlInputArchive的相应字段 valList = new ArrayList<Value>(); DefaultHandler handler = new XMLParser(valList); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(in, handler); vLen = valList.size(); vIdx = 0; }

 // 读取byte类型
    public byte readByte(String tag) throws IOException { Value v = next(); if (!"ex:i1".equals(v.getType())) { throw new IOException("Error deserializing "+tag+"."); } return Byte.parseByte(v.getValue()); }
 

猜你喜欢

转载自www.cnblogs.com/guilf/p/11855209.html
今日推荐