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)); }
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); }