private sealed class ListProcessor : GenericDataProcessor<List<int>>
{
public override bool IsSystem
{
get
{
return true;
}
}
public override bool IsList
{
get
{
return true;
}
}
public override string LanguageKeyword
{
get
{
return "List<int>";
}
}
public override string[] GetTypeStrings()
{
return new string[]
{
"List",
"unityengine.List"
};
}
public override int GetListCount()
{
// return base.GetListCount();
return 0;
}
public override List<int> Parse(string value)
{
string[] splitedValue = value.Split('#');
List<int> intList = new List<int>();
for (int i = 0; i < splitedValue.Length; i++)
{
intList.Add(int.Parse(splitedValue[i]));
}
return intList;
}
public override void WriteToStream(DataTableProcessor dataTableProcessor, BinaryWriter binaryWriter, string value)
{
List<int> intList = Parse(value);
//binaryWriter.Write("#");
for (int i = 0; i < intList.Count; i++)
{
binaryWriter.Write(intList[i].ToString());
}
binaryWriter.Write("#");
}
}
}
因为list比较特殊
在底层加一个变量支持
在DataTableExtension增加扩展方法
public static List<int> ParseList(string value)
{
string[] splitedValue = value.Split(',');
List<int> intList = new List<int>();
for (int i = 0; i < splitedValue.Length; i++)
{
intList.Add(int.Parse(splitedValue[i]));
}
return intList;
}
写一个支持特定格式的List的 BinaryReader 扩展方法
public static List<int> ReadList(this BinaryReader binaryReader)
{
List<int> intList = new List<int>();
string s = "";
bool isBreak=true;
while (isBreak)
{
s = binaryReader.ReadString();
if (s != "#")
{
intList.Add(int.Parse(s));
}
else
{
isBreak = false;
}
}
return intList;
}
在DataTableProcessor中增加一个辅助判定是否是列表变量的函数
public bool IsList(int rawColumn)
{
if (rawColumn < 0 || rawColumn >= RawColumnCount)
{
throw new GameFrameworkException(Utility.Text.Format("Raw column '{0}' is out of range.", rawColumn.ToString()));
}
return m_DataProcessor[rawColumn].IsList;
}
更改一下写入模版方法加入对特定list的支持
private static string GenerateDataTableParser(DataTableProcessor dataTableProcessor)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder
.AppendLine(" public override bool ParseDataRow(string dataRowString, object userData)")
.AppendLine(" {")
.AppendLine(" string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);")
.AppendLine(" for (int i = 0; i < columnStrings.Length; i++)")
.AppendLine(" {")
.AppendLine(" columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);")
.AppendLine(" }")
.AppendLine()
.AppendLine(" int index = 0;");
for (int i = 0; i < dataTableProcessor.RawColumnCount; i++)
{
if (dataTableProcessor.IsCommentColumn(i))
{
// 注释列
stringBuilder.AppendLine(" index++;");
continue;
}
if (dataTableProcessor.IsIdColumn(i))
{
// 编号列
stringBuilder.AppendLine(" m_Id = int.Parse(columnStrings[index++]);");
continue;
}
if (dataTableProcessor.IsSystem(i))
{
string languageKeyword = dataTableProcessor.GetLanguageKeyword(i);
if (languageKeyword == "string")
{
stringBuilder.AppendFormat(" {0} = columnStrings[index++];", dataTableProcessor.GetName(i)).AppendLine();
}
else if (dataTableProcessor.IsList(i))
{
stringBuilder.AppendFormat(" {0} = DataTableExtension.ParseList(columnStrings[index++]);", dataTableProcessor.GetName(i)).AppendLine();
}
else
{
stringBuilder.AppendFormat(" {0} = {1}.Parse(columnStrings[index++]);", dataTableProcessor.GetName(i), languageKeyword).AppendLine();
}
}
else
{
stringBuilder.AppendFormat(" {0} = DataTableExtension.Parse{1}(columnStrings[index++]);", dataTableProcessor.GetName(i), dataTableProcessor.GetType(i).Name).AppendLine();
}
}
stringBuilder.AppendLine()
.AppendLine(" GeneratePropertyArray();")
.AppendLine(" return true;")
.AppendLine(" }")
.AppendLine()
.AppendLine(" public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)")
.AppendLine(" {")
.AppendLine(" using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))")
.AppendLine(" {")
.AppendLine(" using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))")
.AppendLine(" {");
for (int i = 0; i < dataTableProcessor.RawColumnCount; i++)
{
if (dataTableProcessor.IsCommentColumn(i))
{
// 注释列
continue;
}
if (dataTableProcessor.IsIdColumn(i))
{
// 编号列
stringBuilder.AppendLine(" m_Id = binaryReader.Read7BitEncodedInt32();");
continue;
}
string languageKeyword = dataTableProcessor.GetLanguageKeyword(i);
if (dataTableProcessor.IsList(i))
{
stringBuilder.AppendFormat(" {0} = binaryReader.ReadList();", dataTableProcessor.GetName(i)).AppendLine();
continue;
}
if (languageKeyword == "int" || languageKeyword == "uint" || languageKeyword == "long" || languageKeyword == "ulong")
{
stringBuilder.AppendFormat(" {0} = binaryReader.Read7BitEncoded{1}();", dataTableProcessor.GetName(i), dataTableProcessor.GetType(i).Name).AppendLine();
}
else
{
stringBuilder.AppendFormat(" {0} = binaryReader.Read{1}();", dataTableProcessor.GetName(i), dataTableProcessor.GetType(i).Name).AppendLine();
}
}
stringBuilder
.AppendLine(" }")
.AppendLine(" }")
.AppendLine()
.AppendLine(" GeneratePropertyArray();")
.AppendLine(" return true;")
.Append(" }");
return stringBuilder.ToString();
}
Comments | NOTHING