private void CreateData(XmlClassItem data, GeneratorSettings settings, bool isSerializableItem) { var code = new CodeFormatter(); var name = data.name + Constants.DataClassSuffix; code.UseNamespace("System", false); code.UseNamespace("System.Collections.Generic", false); code.UseNamespace("System.Linq", false); code.UseNamespace(Constants.TypesNamespace); code.UseNamespace(Constants.UtilsNamespace); code.UseNamespace(settings.SerializableNamespace); code.UseNamespace(settings.EnumsNamespace); code.NewLine(); code.Namespace(settings.ClassesNamespace); code.Class(name); CommonCodeGenerator.WriteObjectDeserializer(data.name, settings, code); code.Add("return new ", name, "(serializable, database);"); code.CloseBraces(); code.NewLine(); CommonCodeGenerator.WriteObjectConsturctor(data.name, settings, code); if (isSerializableItem) { code.Add("ItemId = new ItemId<", name, ">(serializable.Id, serializable.FileName);"); } foreach (var item in data.members) { CommonCodeGenerator.WriteDeserializationCode(item, code, settings); } code.CloseBraces(); code.NewLine(); CommonCodeGenerator.WriteObjectSerializer(data.name, settings, code); code.Add("var serializable = new ", data.name, Constants.SerializableClassSuffix, "();"); SerializeMembers(data.members, data.typeid, code, isSerializableItem); code.Add("return serializable;"); code.CloseBraces(); code.NewLine(); if (isSerializableItem) { code.Add("public readonly ItemId<", name, "> ItemId;"); } foreach (var item in data.members) { CommonCodeGenerator.WriteDataMember(item, code, _schema); } _codeWriter.Write(settings.ClassesNamespace, name, code.ToString()); }
private static void SerializeMembers(IEnumerable <XmlClassMember> members, string dataTypeId, CodeFormatter code, bool isSerializableItem) { if (isSerializableItem) { code.Add("serializable.Id = ItemId.Id;"); code.Add("serializable.FileName = ItemId.Name;"); code.Add("serializable.ItemType = (int)ItemType.", dataTypeId, ";"); } foreach (var item in members) { CommonCodeGenerator.WriteSerializationCode(item, code); } }
private void AddDeserializationCode(CodeFormatter code, string name, string type, ref bool isFirst, bool isUnique) { if (isFirst) { code.Add("if (type == ", DatabaseSchema.ItemTypeEnum, ".", type, ")"); isFirst = false; } else { code.Add("else if (type == ", DatabaseSchema.ItemTypeEnum, ".", type, ")"); } code.OpenBraces(); code.Add("var data = _serializer.FromJson<", name, Constants.SerializableClassSuffix, ">(file.Content);"); code.Add("data.FileName = file.Name;"); if (isUnique) { code.Add("if (", name, "!= null)"); code.Add(Constants.Indent, "throw new DatabaseException(\"Duplicate settings file found - \" + file.Name);"); code.Add(name, " = data;"); } else { code.Add(GetMemberName(name), ".Add(data.ItemType, data);"); } code.CloseBraces(); }
private void CreateSerializable(XmlClassItem data, GeneratorSettings context, bool isSerializableItem) { var code = new CodeFormatter(); var name = data.name + Constants.SerializableClassSuffix; code.UseNamespace("System", false); code.UseNamespace("System.ComponentModel", false); code.UseNamespace(Constants.TypesNamespace); code.UseNamespace(Constants.SerializationNamespace); code.UseNamespace(context.EnumsNamespace); code.NewLine(); code.Namespace(context.SerializableNamespace); code.Add("[Serializable]"); if (isSerializableItem) { code.Class(name, true, "SerializableItem"); } else { code.Class(name); } var members = new HashSet <string>(); foreach (var item in data.members) { if (!members.Add(item.name)) { continue; } CommonCodeGenerator.WriteSerializableMember(item, code, _schema); } _codeWriter.Write(context.SerializableNamespace, name, code.ToString()); }
public static void WriteSerializationCode(XmlClassMember member, CodeFormatter code) { var memberName = !string.IsNullOrEmpty(member.alias) ? member.alias : member.name; if (member.type == Constants.TypeInt || member.type == Constants.TypeFloat) { code.Add("serializable.", member.name, " = ", memberName, ".Value;"); } else if (member.type == Constants.TypeObject) { code.Add("serializable.", member.name, " = ", memberName, ".Id;"); } else if (member.type == Constants.TypeObjectList) { code.Add("serializable.", member.name, " = ", memberName, "?.Select(item => item.Item.Id).ToArray();"); } else if (member.type == Constants.TypeStruct) { code.Add("serializable.", member.name, " = ", memberName, ".Serialize();"); } else if (member.type == Constants.TypeStructList) { code.Add("serializable.", member.name, " = ", memberName, "?.Select(item => item.Serialize()).ToArray();"); } else if (member.type == Constants.TypeColor) { code.Add("serializable.", member.name, " = ", "Utils.ColorUtils.ColorToString(", memberName, ");"); } else if (member.type == Constants.TypeLayout) { code.Add("serializable.", member.name, " = ", memberName, ".Data;"); } else if (member.type == Constants.TypeAudioClip) { code.Add("serializable.", member.name, " = ", memberName, ".ToString();"); } else if (member.type == Constants.TypeImage) { code.Add("serializable.", member.name, " = ", memberName, ".ToString();"); } else { code.Add("serializable.", member.name, " = ", memberName, ";"); } }
public void Generate(XmlEnumItem data, GeneratorSettings settings) { var code = new CodeFormatter(); var ns = settings.EnumsNamespace; code.Namespace(settings.EnumsNamespace); code.Add("public enum ", data.name); code.OpenBraces(); foreach (var item in data.items) { if (string.IsNullOrEmpty(item.value)) { code.Add(item.name, ","); } else { code.Add(item.name, " = ", item.value, ","); } } _codeWriter.Write(ns, data.name, code.ToString()); }
private void AddContentClasses(string objectName, Dictionary <string, List <XmlClassMember> > members, GeneratorSettings settings, CodeFormatter code) { var serializableName = CommonCodeGenerator.SerializableClass(objectName); code.Add("private interface ", ContentInterfaceName, " { ", serializableName, " ", settings.SerializeMethod, "(); }"); code.NewLine(); code.Class(EmptyContentClassName, false, ContentInterfaceName); CommonCodeGenerator.WriteObjectSerializer(objectName, settings, code); code.Add("return new ", serializableName, "();"); code.CloseBraces(); code.CloseBraces(); foreach (var item in members) { var className = GetContentClassName(item.Key); code.Class(className, false, ContentInterfaceName); code.Add("public ", className, "(", serializableName, " serializable, ", settings.DatabaseClass, " database)"); code.OpenBraces(); code.Add("if (serializable == null || database == null) return;"); foreach (var member in item.Value) { CommonCodeGenerator.WriteDeserializationCode(member, code, settings); } code.CloseBraces(); code.NewLine(); CommonCodeGenerator.WriteObjectSerializer(objectName, settings, code); code.Add("var serializable = new ", serializableName, "();"); foreach (var member in item.Value) { CommonCodeGenerator.WriteSerializationCode(member, code); } code.Add("return serializable;"); code.CloseBraces(); code.NewLine(); foreach (var member in item.Value) { CommonCodeGenerator.WriteDataMember(member, code, _schema); } code.CloseBraces(); code.NewLine(); } }
private void GenerateDatabase(GeneratorSettings context) { var code = new CodeFormatter(); code.UseNamespace("System.Collections.Generic", false); code.UseNamespace("System.Linq", false); code.UseNamespace(Constants.TypesNamespace); code.UseNamespace(Constants.DataSourceNamespace); code.UseNamespace(Constants.SerializationNamespace); code.UseNamespace(context.ClassesNamespace); code.NewLine(); code.Namespace(Constants.DatabaseNamespace); code.Add("public class ", context.DatabaseClass); code.OpenBraces(); code.Add("public ", context.DatabaseClass, "(IDataSource defaultDataSource, IJsonSerializer serializer)"); code.OpenBraces(); code.Add("_serializer = serializer;"); code.Add("_defaultDataSource = defaultDataSource;"); code.Add("Load();"); code.CloseBraces(); code.NewLine(); code.Add("public void Load(IDataSource dataSource = null)"); code.OpenBraces(); code.Add("Reset();"); code.Add("_jsonDatabase = new ", JsonDatabaseClassName, "(dataSource ?? _defaultDataSource, _serializer);"); code.CloseBraces(); code.NewLine(); code.Add("private void Reset()"); code.OpenBraces(); code.Add("Reset();"); foreach (var item in _classes) { code.Add(GetMemberName(item.Key), ".Clear();"); } foreach (var item in _configurations) { code.Add(GetConfigMemberName(item.Key), " = null;"); } code.Add("_jsonDatabase = null;"); code.CloseBraces(); code.NewLine(); foreach (var item in _configurations) { var memberName = GetConfigMemberName(item.Key); code.Add("public ", item.Key, Constants.DataClassSuffix, " ", item.Key, " => ", memberName, " ?? (", memberName, " = ", item.Key, Constants.DataClassSuffix, ".Deserialize(_jsonDatabase.", item.Key, ", this));"); } code.NewLine(); foreach (var item in _classes) { var memberName = GetMemberName(item.Key); var className = item.Key + Constants.DataClassSuffix; code.Add("public IEnumerable<ItemId<", className, ">> ", CommonCodeGenerator.DatabaseGetAllMethod(item.Key), " { get { return _jsonDatabase.", item.Key, "List.Select(item => new ItemId<", className, ">(item.Id, item.FileName)); } }"); code.Add("public ItemId<", className, "> ", CommonCodeGenerator.DatabaseGetIdMethod(item.Key), "(int id) { return new ItemId<", className, ">(_jsonDatabase.", CommonCodeGenerator.DatabaseGetMethod(item.Key), "(id)); }"); code.Add("public ", className, " ", CommonCodeGenerator.DatabaseGetMethod(item.Key), "(int id)"); code.OpenBraces(); code.Add("if (!", memberName, ".TryGetValue(id, out var item))"); code.OpenBraces(); code.Add(memberName, ".Add(id, null);"); code.Add(memberName, "[id] = item = ", className, ".Deserialize(_jsonDatabase.Get", item.Key, "(id), this);"); code.CloseBraces(); code.Add("if (item == null) throw new DatabaseException(CircularDependencyText + \"", item.Key, "_\" + id);"); code.Add("return item;"); code.CloseBraces(); code.NewLine(); } foreach (var item in _configurations) { code.Add("private ", item.Key, Constants.DataClassSuffix, " ", GetConfigMemberName(item.Key), ";"); } foreach (var item in _classes) { code.Add("private readonly Dictionary<int, ", item.Key, Constants.DataClassSuffix, "> ", GetMemberName(item.Key), " = new Dictionary<int, ", item.Key, Constants.DataClassSuffix, ">();"); } code.NewLine(); code.Add("private ", JsonDatabaseClassName, " _jsonDatabase;"); code.Add("private readonly IJsonSerializer _serializer;"); code.Add("private readonly IDataSource _defaultDataSource;"); code.Add("private const string CircularDependencyText = \"Circular dependency found: \";"); _codeWriter.Write(string.Empty, context.DatabaseClass, code.ToString()); }
private void GenerateJsonDatabase(GeneratorSettings context) { var code = new CodeFormatter(); code.UseNamespace("System.Collections.Generic", false); code.UseNamespace(Constants.DataSourceNamespace); code.UseNamespace(Constants.SerializationNamespace); code.UseNamespace(context.SerializableNamespace); code.UseNamespace(context.EnumsNamespace); code.NewLine(); code.Namespace(Constants.DatabaseNamespace); code.Add("public class ", JsonDatabaseClassName); code.OpenBraces(); code.Add("public ", JsonDatabaseClassName, "(IDataSource dataSource, IJsonSerializer serializer)"); code.OpenBraces(); code.Add("_dataSource = dataSource;"); code.Add("_serializer = serializer;"); code.Add("foreach (var file in dataSource.Files)"); code.OpenBraces(); code.Add("var item = _serializer.FromJson<SerializableItem>(file.Content);"); code.Add("var type = (ItemType)item.ItemType;"); var first = true; foreach (var item in _classes) { AddDeserializationCode(code, item.Key, item.Value, ref first, false); } foreach (var item in _configurations) { AddDeserializationCode(code, item.Key, item.Value, ref first, true); } if (!first) { code.Add("else"); code.OpenBraces(); code.Add("throw new DatabaseException(\"Unknown file type - \" + type + \"(\" + file.Name + \")\");"); code.CloseBraces(); } code.CloseBraces(); code.CloseBraces(); code.NewLine(); foreach (var item in _configurations) { code.Add("public ", item.Key, Constants.SerializableClassSuffix, " ", item.Key, " { get; }"); } code.NewLine(); foreach (var item in _classes) { code.Add("public IEnumerable<", item.Key, Constants.SerializableClassSuffix, "> ", item.Key, "List => ", GetMemberName(item.Key), ".Values;"); } code.NewLine(); foreach (var item in _classes) { code.Add("public ", item.Key, Constants.SerializableClassSuffix, " Get", item.Key, "(int id) => ", GetMemberName(item.Key), ".TryGetValue(id, out var value) ? value : null;"); } code.NewLine(); foreach (var item in _classes) { code.Add("private readonly Dictionary<int, ", item.Key, Constants.SerializableClassSuffix, "> ", GetMemberName(item.Key), " = new Dictionary<int, ", item.Key, Constants.SerializableClassSuffix, ">();"); } code.NewLine(); code.Add("private readonly IDataSource _dataSource;"); code.Add("private readonly IJsonSerializer _serializer;"); _codeWriter.Write(string.Empty, JsonDatabaseClassName, code.ToString()); }
private static void AddDataAdapterImplementation(IEnumerable <XmlClassMember> baseMembers, string switchMemberName, CodeFormatter code) { code.Add("public event Action LayoutChangedEvent;"); code.Add("public event Action DataChangedEvent;"); code.Add("public IEnumerable<IProperty> Properties"); code.OpenBraces(); code.Add("get"); code.OpenBraces(); code.Add("var type = GetType();"); //if (isSerializableItem) // code.Add("yield return new Property(this, type.GetField(\"ItemId\"), DataChangedEvent);"); foreach (var item in baseMembers) { code.Add("yield return new Property(this, type.GetField(\"", item.name, "\"), ", item.name == switchMemberName ? "OnTypeChanged" : "DataChangedEvent", ");"); } code.Add("foreach (var item in ", ContentPropertyName, ".GetType().GetFields().Where(f => f.IsPublic && !f.IsStatic))"); code.Add(Constants.Indent, "yield return new Property(Content, item, DataChangedEvent);"); code.CloseBraces(); code.CloseBraces(); code.NewLine(); code.Add("private void OnTypeChanged()"); code.OpenBraces(); code.Add(CreateContentMethodName, "(null, null);"); code.Add("DataChangedEvent?.Invoke();"); code.Add("LayoutChangedEvent?.Invoke();"); code.CloseBraces(); code.NewLine(); code.Add("private ", ContentInterfaceName, " ", ContentPropertyName, " { get; set; }"); code.NewLine(); }
private void CreateMutableData(XmlClassItem data, GeneratorSettings settings, bool isSerializableItem) { SortMembers(data, out var baseMembers, out var extraMembers); var code = new CodeFormatter(); var name = data.name + Constants.DataClassSuffix; var switchEnumType = baseMembers.First(item => item.name.Equals(data.switchEnum, StringComparison.Ordinal)).typeid; code.UseNamespace("System", false); code.UseNamespace("System.Collections.Generic", false); code.UseNamespace("System.Linq", false); code.UseNamespace(Constants.TypesNamespace); code.UseNamespace(Constants.UtilsNamespace); code.UseNamespace(settings.SerializableNamespace); code.UseNamespace(settings.EnumsNamespace); code.NewLine(); code.Namespace(settings.ClassesNamespace); code.Class(name, true, "IDataAdapter"); CommonCodeGenerator.WriteObjectDeserializer(data.name, settings, code); code.Add("var data = new ", name, "(serializable, database); "); code.Add("data.CreateContent(serializable, database);"); code.Add("return data;"); code.CloseBraces(); code.NewLine(); CommonCodeGenerator.WriteObjectConsturctor(data.name, settings, code); if (isSerializableItem) { code.Add("ItemId = new ItemId<", name, ">(serializable.Id, serializable.FileName);"); } foreach (var item in baseMembers) { CommonCodeGenerator.WriteDeserializationCode(item, code, settings); } code.CloseBraces(); code.NewLine(); code.Add("private void ", CreateContentMethodName, "(", CommonCodeGenerator.SerializableClass(data.name), " serializable, ", settings.DatabaseClass, " database)"); code.OpenBraces(); var first = true; foreach (var item in extraMembers) { code.Add(first ? "if (" : "else if (", "serializable.", data.switchEnum, " == ", switchEnumType, ".", item.Key, ")"); code.Add(Constants.Indent, ContentPropertyName, " = new ", GetContentClassName(item.Key), "(serializable, database);"); first = false; } if (!first) { code.Add("else"); } code.Add(first ? string.Empty : Constants.Indent, ContentPropertyName, " = new ", EmptyContentClassName, "();"); code.CloseBraces(); code.NewLine(); CommonCodeGenerator.WriteObjectSerializer(data.name, settings, code); code.Add("var serializable = Content.Serialize();"); SerializeMembers(baseMembers, data.typeid, code, isSerializableItem); code.Add("return serializable;"); code.CloseBraces(); code.NewLine(); AddDataAdapterImplementation(baseMembers, data.switchEnum, code); if (isSerializableItem) { code.Add("public readonly ItemId<", name, "> ItemId;"); } foreach (var item in baseMembers) { CommonCodeGenerator.WriteDataMember(item, code, _schema); } code.NewLine(); AddContentClasses(data.name, extraMembers, settings, code); _codeWriter.Write(settings.ClassesNamespace, name, code.ToString()); }
public static void WriteDeserializationCode(XmlClassMember member, CodeFormatter code, GeneratorSettings settings) { var memberName = !string.IsNullOrEmpty(member.alias) ? member.alias : member.name; if (member.type == Constants.TypeObject) { code.Add(memberName, " = database.", DatabaseGetIdMethod(member.typeid), "(serializable.", member.name, ");"); } else if (member.type == Constants.TypeObjectList) { code.Add(memberName, " = ", "serializable.", member.name, "?.Select(item => new Wrapper<", DataClass(member.typeid), "> { Item = database.", DatabaseGetIdMethod(member.typeid), "(item) }).ToArray();"); } else if (member.type == Constants.TypeStruct) { code.Add(memberName, " = ", DataClass(member.typeid), ".", settings.DeserializeMethod, "(serializable.", member.name, ", database);"); } else if (member.type == Constants.TypeStructList) { code.Add(memberName, " = ", "serializable.", member.name, "?.Select(item => ", DataClass(member.typeid), ".", settings.DeserializeMethod, "(item, database)).ToArray();"); } else if (member.type == Constants.TypeInt) { MinMaxInt(member, out var minvalue, out var maxvalue); code.Add(memberName, " = new NumericValue<int>(serializable.", member.name, ", ", minvalue.ToString(), ", ", maxvalue.ToString(), ");"); } else if (member.type == Constants.TypeFloat) { MinMaxFloat(member, out var minvalue, out var maxvalue); code.Add(memberName, " = new NumericValue<float>(serializable.", member.name, ", ", minvalue.ToString(), "f, ", maxvalue.ToString(), "f);"); } else if (member.type == Constants.TypeColor) { code.Add(memberName, " = Utils.ColorUtils.ColorFromString(serializable.", member.name, ");"); } else if (member.type == Constants.TypeLayout) { code.Add(memberName, " = new Layout(serializable.", member.name, ");"); } else if (member.type == Constants.TypeAudioClip) { code.Add(memberName, " = new AudioClipId(serializable.", member.name, ");"); } else if (member.type == Constants.TypeImage) { code.Add(memberName, " = new SpriteId(serializable.", member.name, ");"); } else { code.Add(memberName, " = serializable.", member.name, ";"); } }
public static void WriteObjectDeserializer(string objectName, GeneratorSettings settings, CodeFormatter code) { code.Add("public static ", objectName, Constants.DataClassSuffix, " ", settings.DeserializeMethod, "(", objectName, Constants.SerializableClassSuffix, " serializable, ", settings.DatabaseClass, " database)"); code.OpenBraces(); }
public static void WriteDataMember(XmlClassMember member, CodeFormatter code, DatabaseSchema schema) { var memberName = !string.IsNullOrEmpty(member.alias) ? member.alias : member.name; if (member.type == Constants.TypeInt) { MinMaxInt(member, out var minvalue, out var maxvalue); code.Add("public NumericValue<int> ", memberName, " = new NumericValue<int>(0,", minvalue.ToString(), ",", maxvalue.ToString(), ");"); } else if (member.type == Constants.TypeFloat) { MinMaxFloat(member, out var minvalue, out var maxvalue); code.Add("public NumericValue<float> ", memberName, " = new NumericValue<float>(0,", minvalue.ToString(), "f,", maxvalue.ToString(), "f);"); } else if (member.type == Constants.TypeBool) { code.Add("public bool ", memberName, ";"); } else if (member.type == Constants.TypeString) { code.Add("public string ", memberName, ";"); } else if (member.type == Constants.TypeColor) { code.Add("public UnityEngine.Color ", memberName, ";"); } else if (member.type == Constants.TypeImage) { code.Add("public SpriteId ", memberName, ";"); } else if (member.type == Constants.TypeAudioClip) { code.Add("public AudioClipId ", memberName, ";"); } else if (member.type == Constants.TypeLayout) { code.Add("public Layout ", memberName, ";"); } else if (member.type == Constants.TypeVector) { code.Add("public Vector ", memberName, " = Vector.Zero;"); } else if (member.type == Constants.TypeEnum) { if (!schema.HasEnum(member.typeid)) { throw new InvalidSchemaException("Unknown enum type in class member " + member.name); } code.Add("public ", member.typeid, " ", memberName, ";"); } else if (member.type == Constants.TypeObject) { if (!schema.HasObject(member.typeid)) { throw new InvalidSchemaException("Unknown object type in class member " + member.name); } code.Add("public ItemId<", DataClass(member.typeid), "> ", memberName, " = ItemId<", DataClass(member.typeid), ">.Empty;"); } else if (member.type == Constants.TypeObjectList) { if (!schema.HasObject(member.typeid)) { throw new InvalidSchemaException("Unknown object type in class member " + member.name); } code.Add("public Wrapper<", DataClass(member.typeid), ">[] ", memberName, ";"); } else if (member.type == Constants.TypeStruct) { if (!schema.HasStruct(member.typeid)) { throw new InvalidSchemaException("Unknown struct type in class member " + member.name); } code.Add("public ", DataClass(member.typeid), " ", memberName, ";"); } else if (member.type == Constants.TypeStructList) { if (!schema.HasStruct(member.typeid)) { throw new InvalidSchemaException("Unknown struct type in class member " + member.name); } code.Add("public ", DataClass(member.typeid), "[] ", memberName, ";"); } else { throw new InvalidSchemaException("Invalid class member type - " + member.type); } }
public static void WriteSerializableMember(XmlClassMember member, CodeFormatter code, DatabaseSchema schema) { if (member.type == Constants.TypeInt) { code.Add("public int ", member.name, ";"); } else if (member.type == Constants.TypeFloat) { code.Add("public float ", member.name, ";"); } else if (member.type == Constants.TypeBool) { code.Add("public bool ", member.name, ";"); } else if (member.type == Constants.TypeString) { code.Add(DefaultStringValue); code.Add("public string ", member.name, ";"); } else if (member.type == Constants.TypeColor) { code.Add(DefaultStringValue); code.Add("public string ", member.name, ";"); } else if (member.type == Constants.TypeImage) { code.Add(DefaultStringValue); code.Add("public string ", member.name, ";"); } else if (member.type == Constants.TypeAudioClip) { code.Add(DefaultStringValue); code.Add("public string ", member.name, ";"); } else if (member.type == Constants.TypeLayout) { code.Add(DefaultStringValue); code.Add("public string ", member.name, ";"); } else if (member.type == Constants.TypeVector) { code.Add("public Vector ", member.name, ";"); } else if (member.type == Constants.TypeEnum) { if (!schema.HasEnum(member.typeid)) { throw new InvalidSchemaException("Unknown enum type in class member " + member.name); } code.Add("public ", member.typeid, " ", member.name, ";"); } else if (member.type == Constants.TypeObject) { if (!schema.HasObject(member.typeid)) { throw new InvalidSchemaException("Unknown object type in class member " + member.name); } code.Add("public int ", member.name, ";"); } else if (member.type == Constants.TypeObjectList) { if (!schema.HasObject(member.typeid)) { throw new InvalidSchemaException("Unknown object type in class member " + member.name); } code.Add("public int[] ", member.name, ";"); } else if (member.type == Constants.TypeStruct) { if (!schema.HasStruct(member.typeid)) { throw new InvalidSchemaException("Unknown struct type in class member " + member.name); } code.Add("public ", SerializableClass(member.typeid), " ", member.name, ";"); } else if (member.type == Constants.TypeStructList) { if (!schema.HasStruct(member.typeid)) { throw new InvalidSchemaException("Unknown struct type in class member " + member.name); } code.Add("public ", SerializableClass(member.typeid), "[] ", member.name, ";"); } else { throw new InvalidSchemaException("Invalid class member type - " + member.type); } }