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;
}
}
}