using System.IO;
namespace ProtoCSStruct
{
///
/// 定义接口,方便代码使用
///
public interface IStructMessage
{
void ReadFrom(CodedInputStream input);
void WriteTo(CodedOutputStream output);
int CalculateSize();//打包后的大小
void Clear();
string GetName();
string ToString();
int StructSizeof(); //结构体内存大小(估算,不完全正确)
}
public interface IStructMessage : IStructMessage where T : struct, IStructMessage
{
}
public interface IStructMessageParser
{
void ParseFrom(byte[] data, int length);
string GetMessageString();
string GetMessageName();
IStructMessageParser Clone();
int GetStructSizeof();
}
public class StructMessageParser : IStructMessageParser where T : struct, IStructMessage
{
///
/// 线程不安全,请逻辑层自己注意!!!
///
T structData;
CodedInputStream input;
public void ParseFrom(byte[] data, int length)
{
if(input != null)
{
input.Init(data, 0, length);
}
else
{
input = new CodedInputStream(data, 0, length);
}
structData.Clear();
structData.ReadFrom(input);
return;
}
public string GetMessageString()
{
return structData.ToString();
}
public string GetMessageName()
{
return structData.GetName();
}
public ref T GetMessage()
{
return ref structData;
}
public ref T GetMessageClear()
{
structData.Clear();
return ref structData;
}
public IStructMessageParser Clone()
{
var cloneParser = new StructMessageParser();
cloneParser.structData = this.structData;
return cloneParser;
}
public int GetStructSizeof()
{
return structData.StructSizeof();
}
}
///
/// parse 整个buffer
///
public static class StructMessageParseUtils
{
public static void ParseFrom(ref T message, byte[] buffer )
where T : struct, IStructMessage
{
CodedInputStream input = new CodedInputStream(buffer);
message.ReadFrom(input);
}
public static byte[] ToByteArray(ref T message)
where T : struct, IStructMessage
{
int size = message.CalculateSize();
if (size == 0) return new byte[0];
byte[] buffer = new byte[size];
CodedOutputStream output = new CodedOutputStream(buffer);
message.WriteTo(output);
//return buffer.Skip(0).Take(size).ToArray();
return buffer;
}
}
}