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