using CommonLang.IO; using CommonLang.Log; using CommonLang.Property; using CommonLang.Protocol; using System; using System.IO; namespace CommonLang.Net { public interface INetPackageCodec { /// /// 将网络流中的数据解析成对象 /// /// /// /// /// 返回true则表示此次对象解析完成,进行下一次解析 bool doDecode(Stream input, out object message); /// /// 将对象编码传输至网络流 /// /// /// /// /// bool doEncode(Stream output, object message); } public class SimpleExternalizableCodec : INetPackageCodec { private Logger log = LoggerFactory.GetLogger("SimpleExternalizableCodec"); private IExternalizableFactory factory; public CommonLang.IO.IExternalizableFactory Factory { get { return factory; } } public SimpleExternalizableCodec(IExternalizableFactory externalizableFactory) { this.factory = externalizableFactory; } public bool doDecode(Stream input, out object message) { InputStream reader = new InputStream(input, factory); int typeInt = reader.GetS32(); Type type = factory.GetType(typeInt); if (type == null) { log.Error("Unknow Protocol : >>>0x" + typeInt.ToString("X") + "<<<"); message = null; return false; } else { IMessage nm = (IMessage)ReflectionUtil.CreateInstance(type); nm.ReadExternal(reader); message = nm; return true; } } public bool doEncode(Stream output, object message) { IMessage nm = (IMessage)message; OutputStream writer = new OutputStream(output, factory); int typeInt = factory.GetTypeID(message.GetType()); if (typeInt == 0) { log.Error("Unknow Protocol : >>>0x" + typeInt.ToString("X") + "<<< - " + message.GetType().FullName); return false; } writer.PutS32(typeInt); nm.WriteExternal(writer); return true; } } }