internal void GenerateProperties() { Type baseType = Nullable.GetUnderlyingType(TypeGoInfo.Type); if (baseType == null) { baseType = TypeGoInfo.Type; } baseType = ReflectionHelper.GenerateTypeFromInterface(baseType, Options); List <System.Reflection.PropertyInfo> properties = ReflectionHelper.GetListOfProperties(baseType).ToList(); Properties = new BasePropertyGoInfo <TObject> [properties.Count]; PropertiesLength = properties.Count; for (int i = 0; i < properties.Count; i++) { System.Reflection.PropertyInfo property = properties[i]; BasePropertyGoInfo <TObject> propertyInfo = (BasePropertyGoInfo <TObject>)Activator.CreateInstance(typeof(PropertyGoInfo <,>) .MakeGenericType(typeof(TObject), property.PropertyType), property, Options); TypeGoInfo.Properties[property.Name] = propertyInfo; propertyInfo.Index = i; propertyInfo.Type = property.PropertyType; propertyInfo.Name = property.Name; propertyInfo.NameBytes = Options.Encoding.GetBytes(property.Name); Properties[i] = propertyInfo; } for (int i = 0; i < Properties.Length; i++) { BasePropertyGoInfo <TObject> property = Properties[i]; property.NameSerialized = JsonConstantsString.Quotes.ToString(); property.NameSerialized += property.Name; property.NameSerialized += JsonConstantsString.QuotesColon; } }
internal void RebuildProperties(List <MemberBinaryModelInfo> properties) { Properties = new BasePropertyGoInfo <TObject> [TypeGoInfo.Properties.Count]; PropertiesLength = TypeGoInfo.Properties.Count; int i = 0; foreach (KeyValuePair <string, BasePropertyGoInfo <TObject> > propertyKeyValue in TypeGoInfo.Properties) { BasePropertyGoInfo <TObject> property = propertyKeyValue.Value; property.Name = propertyKeyValue.Key; property.NameBytes = Options.Encoding.GetBytes(property.Name); Properties[i] = property; MemberBinaryModelInfo findProperty = properties.FirstOrDefault(x => x.Name == property.Name); property.Index = findProperty.Index; i++; } //order properties //re indexing properties because generation will set index of properties Properties = Properties.OrderBy(x => x.Index).ToArray(); for (i = 0; i < Properties.Length; i++) { BasePropertyGoInfo <TObject> property = Properties[i]; property.NameSerialized = JsonConstantsString.Quotes.ToString(); property.NameSerialized += property.Name; property.NameSerialized += JsonConstantsString.QuotesColon; } }
/// <summary> /// json serialize /// </summary> /// <param name="handler"></param> /// <param name="value"></param> public void JsonSerialize(ref JsonSerializeHandler handler, ref TObject value) { handler.TextWriter.Write(JsonConstantsString.OpenBraket); for (int i = 0; i < Properties.Length; i++) { BasePropertyGoInfo <TObject> property = Properties[i]; property.TypedJsonSerialize(ref handler, ref value); //object propertyValue = property.InternalGetValue(ref value); //if (propertyValue == null || propertyValue.Equals(property.DefaultValue)) // continue; //handler.TextWriter.Write(property.NameSerialized); //property.JsonSerialize(ref handler, ref propertyValue); //handler.TextWriter.Write(JsonConstantsString.Comma); } handler.TextWriter.RemoveLast(JsonConstantsString.Comma); handler.TextWriter.Write(JsonConstantsString.CloseBracket); }
internal static void ExtractProperty(ref T instance, ref JsonDeserializer deserializer, BasePropertyGoInfo <T> basePropertyGo, ref JsonSpanReader json) { char character = json.Read(); if (character == JsonConstantsString.Quotes) { basePropertyGo.JsonDeserializeString(ref instance, ref json); //return typeGo.JsonDeserialize(ref extract); } else if (character == JsonConstantsString.OpenBraket) { basePropertyGo.JsonDeserializeObject(ref instance, ref deserializer, ref json); } else if (character == JsonConstantsString.OpenSquareBrackets) { basePropertyGo.JsonDeserializeArray(ref instance, ref deserializer, ref json); } else { basePropertyGo.JsonDeserializeValue(ref instance, ref json); //var value = json.ExtractValue(); //if (value[value.Length - 1] == JsonConstantsString.Comma) // value = value.Slice(0, value.Length - 1); //if (typeGo == null || typeGo.JsonDeserialize == null) //{ // return new string(value); //} //return typeGo.JsonDeserialize(ref value); } }