private static bool WriteField(ScorpioWriter write, string type, object value) { if (type == BoolType) { write.WriteBool((bool)value); } else if (type == Int8Type) { write.WriteInt8(ScorpioUtil.ToInt8(value)); } else if (type == Int16Type) { write.WriteInt16(ScorpioUtil.ToInt16(value)); } else if (type == Int32Type || type == IntType) { write.WriteInt32(ScorpioUtil.ToInt32(value)); } else if (type == Int64Type) { write.WriteInt64(ScorpioUtil.ToInt64(value)); } else if (type == FloatType) { write.WriteFloat(ScorpioUtil.ToFloat(value)); } else if (type == DoubleType) { write.WriteDouble(ScorpioUtil.ToDouble(value)); } else if (type == StringType) { write.WriteString((string)value); } else if (type == BytesType) { write.WriteBytes((byte[])value); } else { return(false); } return(true); }
public static ScriptTable Read(Script script, ScorpioReader reader, string tableName, bool hasSign) { ScriptTable table = script.CreateTable(); ScriptArray layout = (ScriptArray)script.GetValue(tableName); bool isInvalid = true; int sign = hasSign ? reader.ReadInt32() : 0; for (int i = 0; i < layout.Count(); ++i) { ScriptObject config = layout.GetValue(i); if (!hasSign || ScorpioUtil.HasSign(sign, ScorpioUtil.ToInt32(config.GetValue(Index).ObjectValue))) { string name = (string)config.GetValue(Name).ObjectValue; string type = (string)config.GetValue(Type).ObjectValue; bool array = (bool)config.GetValue(Array).ObjectValue; Invalid invalid = new Invalid(); if (array) { int count = reader.ReadInt32(); ScriptArray value = script.CreateArray(); for (int j = 0; j < count; ++j) { value.Add(ReadObject(script, reader, type, hasSign, invalid)); } table.SetValue(name, value); if (count > 0) { isInvalid = false; } } else { table.SetValue(name, ReadObject(script, reader, type, hasSign, invalid)); if (!invalid.value) { isInvalid = false; } } } } table.SetValue("IsInvalid", script.CreateBool(isInvalid)); return(table); }
private static void Write(Script script, ScorpioWriter writer, ScriptTable table, string tableName) { ScriptArray layout = (ScriptArray)script.GetValue(tableName); int sign = 0; for (int i = 0; i < layout.Count(); ++i) { ScriptObject config = layout.GetValue(i); if (table != null && table.HasValue(config.GetValue(Name).ObjectValue)) { sign = ScorpioUtil.AddSign(sign, ScorpioUtil.ToInt32(config.GetValue(Index).ObjectValue)); } } writer.WriteInt32(sign); for (int i = 0; i < layout.Count(); ++i) { ScriptObject config = layout.GetValue(i); string name = (string)config.GetValue(Name).ObjectValue; if (table != null && table.HasValue(name)) { string type = (string)config.GetValue(Type).ObjectValue; bool array = (bool)config.GetValue(Array).ObjectValue; if (array) { ScriptArray arr = table.GetValue(name) as ScriptArray; writer.WriteInt32(arr.Count()); for (int j = 0; j < arr.Count(); ++j) { WriteObject(script, writer, type, arr.GetValue(j)); } } else { WriteObject(script, writer, type, table.GetValue(name)); } } } }
/// <summary> /// 读取一个网络协议或者一行table数据 /// </summary> /// <param name="script">脚本引擎对象</param> /// <param name="reader">读取类</param> /// <param name="tableManager">tableManager类</param> /// <param name="fileName">table用文件名字</param> /// <param name="layoutTableName">结构名字</param> /// <param name="message">是否是网络协议</param> private static ScriptTable Read(Script script, ScorpioReader reader, ScriptTable tableManager, string fileName, string layoutTableName, bool message) { ScriptTable table = script.CreateTable(); ScriptArray layout = (ScriptArray)script.GetValue(layoutTableName); int sign = message ? reader.ReadInt32() : 0; bool isInvalid = true; string id = null; for (int i = 0; i < layout.Count(); ++i) { ScriptObject config = layout.GetValue(i); if (message && !ScorpioUtil.HasSign(sign, ScorpioUtil.ToInt32(config.GetValue(Index).ObjectValue))) { continue; } string name = config.GetValue(Name).ToString(); //字段名字 string type = config.GetValue(Type).ToString(); //字段类型 bool array = config.GetValue(Array).LogicOperation(); //是否是数组 Invalid invalid = new Invalid(); //本行是否是无效行 if (array) { int count = reader.ReadInt32(); //读取元素个数 ScriptArray value = script.CreateArray(); for (int j = 0; j < count; ++j) { value.Add(ReadObject(script, reader, tableManager, fileName, type, message, invalid)); } table.SetValue(name, value); if (count > 0) { isInvalid = false; } } else { if (message) { table.SetValue(name, ReadObject(script, reader, tableManager, fileName, type, message, invalid)); } else { ScriptTable attribute = config.GetValue(Attribute) as ScriptTable; if (attribute.Count() == 0) { var obj = ReadObject(script, reader, tableManager, fileName, type, message, invalid); table.SetValue(name, obj); if (!invalid.value) { isInvalid = false; } if (string.IsNullOrEmpty(id)) { id = ScorpioUtil.ToInt32(obj.ObjectValue).ToString(); } } else { ReadObject(script, reader, tableManager, fileName, type, message, invalid); //先读取一个值 如果是多国语言 生成数据的时候会写入一个空字符串 table.SetValue(name, script.CreateObject(tableManager.GetValue("getValue").call(attribute, fileName, name, id))); } } } } if (!message) { table.SetValue("IsInvalid", script.CreateBool(isInvalid)); } return(table); }