private string GeneratePlainPropertyDeserializeInstructions(PrimitiveTypeDescriptor propTypeDescriptor, string fieldAccessor)
        {
            var primitive = propTypeDescriptor.PrimitiveTypeName;

            if (propTypeDescriptor.IsSubTypeContainer)
            {
                var subType = propTypeDescriptor.SubType.OriginalType;
                if (primitive == "Object")
                {
                    return($"{fieldAccessor} = XdrConverter.Deserialize<{subType.Name}>(reader);");
                }
                if (primitive == "Array" || primitive == "List")
                {
                    if (subType == typeof(byte))
                    {
                        return($"{fieldAccessor} = reader.ReadVariable();");
                    }
                    return(GenerateArrayPropertyDeserializeInstructions(propTypeDescriptor, fieldAccessor));
                }
            }
            if (propTypeDescriptor.IsEnum)
            {
                return($"{fieldAccessor} = ({propTypeDescriptor.EnumType.Name})reader.Read{propTypeDescriptor.PrimitiveTypeName}();");
            }
            return($"{fieldAccessor} = reader.Read{primitive}();");
        }
        private string GenerateArrayPropertySerializeInstructions(PrimitiveTypeDescriptor propTypeDescriptor, string fieldAccessor)
        {
            var containerTypeName = propTypeDescriptor.PrimitiveTypeName;
            var elementType       = propTypeDescriptor.SubType.OriginalType;
            var lengthAccessor    = containerTypeName == "Array" ? "Length" : "Count";
            var writeInstructions = $"XdrConverter.Serialize(array[i], writer)";

            if (elementType.IsValueType)
            {
                var valueTypeDescriptor = ResolvePrimitiveTypeTypeDescriptor(elementType);
                if (valueTypeDescriptor == null)
                {
                    throw new InvalidProgramException($"Primitive type {elementType.FullName} serialization in arrays is not supported.");
                }
                writeInstructions = $"writer.Write{valueTypeDescriptor.PrimitiveTypeName}(array[i]);";
            }
            return($@"{{
                var array = {fieldAccessor};
                var total = array.{lengthAccessor};
                writer.WriteInt32(total);
                for (var i = 0; i < total; i++)
                {{
                    {writeInstructions};
                }}
                }}");
        }
        private string GeneratePlainPropertySerializeInstructions(PrimitiveTypeDescriptor propTypeDescriptor, string fieldAccessor)
        {
            var primitive = propTypeDescriptor.PrimitiveTypeName;

            if (propTypeDescriptor.IsSubTypeContainer)
            {
                var subType = propTypeDescriptor.SubType.OriginalType;
                if (primitive == "Object")
                {
                    return($"XdrConverter.Serialize({fieldAccessor}, writer);");
                }
                if (primitive == "Array" || primitive == "List")
                {
                    if (subType == typeof(byte))
                    {
                        return($"writer.WriteVariable({fieldAccessor});");
                    }
                    return(GenerateArrayPropertySerializeInstructions(propTypeDescriptor, fieldAccessor));
                }
            }
            if (propTypeDescriptor.IsEnum)
            {
                return($"writer.Write{propTypeDescriptor.PrimitiveTypeName}((int){fieldAccessor});");
            }
            return($"writer.Write{propTypeDescriptor.PrimitiveTypeName}({fieldAccessor});");
        }
        private string GetSubTypeArg(PrimitiveTypeDescriptor propTypeDescriptor, string format)
        {
            if (propTypeDescriptor.SubType == null)
            {
                return(null);
            }
            var subtype = propTypeDescriptor.SubType.PrimitiveTypeName == "Object" ? propTypeDescriptor.SubType.TargetType : propTypeDescriptor.SubType.PrimitiveTypeName;

            return(format.Replace("value", subtype));
        }
예제 #5
0
 public PrimitiveTypeDescriptor CreateSubtypeContainer(PrimitiveTypeDescriptor subtype)
 {
     if (subtype == null)
     {
         throw new ArgumentNullException(nameof(subtype));
     }
     return(new PrimitiveTypeDescriptor(OriginalType, TargetType, PrimitiveTypeName)
     {
         SubType = subtype
     });
 }
        private string GenerateArrayPropertyDeserializeInstructions(PrimitiveTypeDescriptor propTypeDescriptor, string fieldAccessor)
        {
            var isArray          = propTypeDescriptor.PrimitiveTypeName == "Array";
            var elementType      = propTypeDescriptor.SubType.OriginalType;
            var initializer      = isArray ? $"{elementType.Name}[length]" : $"List<{elementType.Name}>(length)";
            var readInstructions = $"XdrConverter.Deserialize<{elementType.Name}>(reader)";

            if (elementType.IsValueType)
            {
                var valueTypeDescriptor = ResolvePrimitiveTypeTypeDescriptor(elementType);
                if (valueTypeDescriptor == null)
                {
                    throw new InvalidProgramException($"Primitive type {elementType.FullName} serialization in arrays is not supported.");
                }
                readInstructions = $"reader.Read{valueTypeDescriptor.PrimitiveTypeName}()";
            }
            return($@"{{
                var length = reader.Read{GetMethodPrimitiveTypeName(typeof(int))}();
                var res = new {initializer};
                for (var i = 0; i < length; i++)
                {{
                    {(isArray ? $"res[i] = {readInstructions}" : $"res.Add({readInstructions})")};
                }}
 protected void MapType(PrimitiveTypeDescriptor typeDescriptor)
 {
     PrimitiveTypesMap.Add(typeDescriptor.OriginalType, typeDescriptor);
 }