private static void AddUnionSerializeMethod(StringBuilder builder, UnionDef union) { var unionFbName = ConvertTypeName(union.UnionType); var unionName = union.UnionType.FullName; builder.AppendLine($@" public static bool Serialize(FlatBufferBuilder fbb, {unionName} obj, out int offset, out {unionFbName} type) {{ if (obj == null) {{ offset = 0; type = {unionFbName}.NONE; return false; }} "); foreach (var t in union.IncludedTypes) { var includedTypeName = t.Item1.FullName; var includedTypeSerializerName = ConvertSerializerName(t.Item1); var includedFbName = ConvertTypeName(t.Item1); builder.AppendLine($@" if (obj is {includedTypeName}) {{ var o = {includedTypeSerializerName}.Instance.Serialize(fbb, ({includedTypeName})obj); offset = o.HasValue ? o.Value.Value : 0; type = {unionFbName}.{includedFbName}; return true; }} "); } builder.AppendLine(@" throw new NotSupportedException(obj.GetType().FullName); }"); }
private static void AddUnionWrapperSerializeMethod(StringBuilder builder, UnionDef union) { var unionFbName = ConvertTypeName(union.UnionType); var unionName = union.UnionType.FullName; var unionWrapperName = ConvertUnionWrapper(union.UnionType); builder.AppendLine($@" public static Offset<{unionWrapperName}>[] Serialize(FlatBufferBuilder fbb, IList<{unionName}> objects) {{ if (objects == null) return null; var offsets = new Offset<{unionWrapperName}>[objects.Count]; for (int i = 0; i < objects.Count; i++) {{ var obj = objects[i]; if (obj == null) {{ offsets[i] = {unionWrapperName}.Create{unionWrapperName}(fbb); continue; }} "); foreach (var t in union.IncludedTypes) { var includedTypeName = t.Item1.FullName; var includedTypeSerializerName = ConvertSerializerName(t.Item1); var includedFbName = ConvertTypeName(t.Item1); builder.AppendLine($@" if (obj is {includedTypeName}) {{ var o = {includedTypeSerializerName}.Instance.Serialize(fbb, ({includedTypeName})obj); var offset = o.HasValue ? o.Value.Value : 0; offsets[i] = {unionWrapperName}.Create{unionWrapperName}(fbb, {unionFbName}.{includedFbName}, offset); continue; }} "); } builder.AppendLine(@" throw new NotSupportedException(obj.GetType().FullName); } return offsets; }"); }
private static void AddUnionWrapperDeserializeMethod(StringBuilder builder, UnionDef union) { var unionName = union.UnionType.FullName; var unionFbName = ConvertTypeName(union.UnionType); var unionWrapperName = ConvertUnionWrapper(union.UnionType); builder.AppendLine($@" public static {unionName}[] Deserialize(int objectsLength, Func<int, {unionWrapperName}?> getObject) {{ if (objectsLength == 0) return null; var objects = new {unionName}[objectsLength]; for (int i = 0; i < objectsLength; i++) {{ var wrapper = getObject(i); if (!wrapper.HasValue) continue; switch (wrapper.Value.BodyType) {{"); foreach (var t in union.IncludedTypes) { var includedTypeName = t.Item1.FullName; var includedTypeSerializerName = ConvertSerializerName(t.Item1); var includedFbName = ConvertTypeName(t.Item1); builder.AppendLine($@" case {unionFbName}.{includedFbName}: objects[i] = {includedTypeSerializerName}.Instance.Deserialize(wrapper.Value.Body<{includedFbName}>()); break; "); } builder.AppendLine($@" case {unionFbName}.NONE: break; default: throw new NotSupportedException(wrapper.Value.BodyType.ToString()); }} }} return objects; }}"); }
public UnionValueElement( Container container, ElementDef def, UnionDef unionDef ) : base(container, def) { this.unionDef = unionDef; }
private static void AddDeserializeUnionMethod(StringBuilder builder, TableDef table, FieldDef field, UnionDef union) { var tableFbName = ConvertTypeName(table.Type); var unionName = union.UnionType.FullName; var unionFbName = ConvertTypeName(union.UnionType); builder.AppendLine($@" private {unionName} Deserialize{field.Name}({tableFbName} obj) {{ switch (obj.{field.Name}Type) {{"); foreach (var t in union.IncludedTypes) { var includedFbName = ConvertTypeName(t.Item1); var includedSerializerName = ConvertSerializerName(t.Item1); builder.AppendLine($@" case {unionFbName}.{includedFbName}: return {includedSerializerName}.Instance.Deserialize(obj.{field.Name}<{includedFbName}>());"); } builder.AppendLine($@" case {unionFbName}.NONE: return null; default: throw new NotSupportedException(obj.{field.Name}Type.ToString()); }} }}"); }