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;
        }}");
        }
Ejemplo n.º 4
0
 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());
            }}
        }}");
        }