public void Write(TSerializer oprot) { TStruct struc = new TStruct("TApplicationException"); TField field = new TField(); //在流中写入TStruct的name:"TApplicationException" oprot.WriteStructBegin(struc); //判断Message是否为空 if (!String.IsNullOrEmpty(Message)) { field.Name = "message"; field.Type = TType.String; field.ID = 1; oprot.WriteFieldBegin(field); oprot.WriteString(Message); oprot.WriteFieldEnd();//空 } //再写一个field到流中 field.Name = "type"; field.Type = TType.I32; field.ID = 2; oprot.WriteFieldBegin(field); //在流中写入异常的类型 oprot.WriteI32((int)type); oprot.WriteFieldEnd(); //完成后写一个Stop标志 WriteByte((byte)TType.Stop) oprot.WriteFieldStop(); oprot.WriteStructEnd(); }
//从流里面读取异常消息 public static TApplicationException Read(TSerializer iprot) { TField field; string message = null; ExceptionType type = ExceptionType.Unknown; //从流里面读取truct的name;这里只是读取并不用 iprot.ReadStructBegin(); while (true) { //读取两次,一次是field.Type = (TType)ReadByte() 另一次是:field.ID = ReadI16() field = iprot.ReadFieldBegin(); if (field.Type == TType.Stop) { //一直读取直到field.Type == TType.Stop为止 break; } switch (field.ID) { case 1: if (field.Type == TType.String) { message = iprot.ReadString(); } else { //仅从流中把数据读取出来,不做任何操作 TSerializerUtil.Skip(iprot, field.Type); } break; case 2: if (field.Type == TType.I32) { type = (ExceptionType)iprot.ReadI32(); } else { TSerializerUtil.Skip(iprot, field.Type); } break; default: TSerializerUtil.Skip(iprot, field.Type); break; } //空方法(对二进制流) iprot.ReadFieldEnd(); } //空方法 iprot.ReadStructEnd(); return(new TApplicationException(type, message)); }
public static void Skip(TSerializer prot, TType type) { switch (type) { case TType.Bool: prot.ReadBool(); break; case TType.Byte: prot.ReadByte(); break; case TType.I16: prot.ReadI16(); break; case TType.I32: prot.ReadI32(); break; case TType.I64: prot.ReadI64(); break; case TType.Double: prot.ReadDouble(); break; case TType.String: // Don't try to decode the string, just skip it. prot.ReadBinary(); break; case TType.Struct: prot.ReadStructBegin(); while (true) { TField field = prot.ReadFieldBegin(); if (field.Type == TType.Stop) { break; } Skip(prot, field.Type); prot.ReadFieldEnd(); } prot.ReadStructEnd(); break; case TType.Map: TMap map = prot.ReadMapBegin(); for (int i = 0; i < map.Count; i++) { Skip(prot, map.KeyType); Skip(prot, map.ValueType); } prot.ReadMapEnd(); break; case TType.Set: TSet set = prot.ReadSetBegin(); for (int i = 0; i < set.Count; i++) { Skip(prot, set.ElementType); } prot.ReadSetEnd(); break; case TType.List: TList list = prot.ReadListBegin(); for (int i = 0; i < list.Count; i++) { Skip(prot, list.ElementType); } prot.ReadListEnd(); break; } }