public override int WriteMembers(ByteBuffer buffer, object container) { int num = 0; foreach (object obj in (IEnumerable)container) { if (obj != null) { SerializableType type = this.itemType; if (obj.GetType() != type.type) { type = this.serializer.GetType(obj.GetType()); } type.WriteObject(buffer, obj); } else { AmqpEncoding.EncodeNull(buffer); } num++; } return(num); }
public override int WriteMembers(ByteBuffer buffer, object container) { int num = 0; foreach (object obj in (IEnumerable)container) { object obj1 = this.keyAccessor.Get(obj); object obj2 = this.valueAccessor.Get(obj); if (obj2 == null) { continue; } this.keyType.WriteObject(buffer, obj1); SerializableType type = this.valueType; if (obj2.GetType() != type.type) { type = this.serializer.GetType(obj2.GetType()); } type.WriteObject(buffer, obj2); num = num + 2; } return(num); }
public override int WriteMembers(ByteBuffer buffer, object container) { SerialiableMember[] members = this.Members; for (int i = 0; i < (int)members.Length; i++) { SerialiableMember serialiableMember = members[i]; object obj = serialiableMember.Accessor.Get(container); if (obj != null) { SerializableType type = serialiableMember.Type; if (obj.GetType() != type.type) { type = this.serializer.GetType(obj.GetType()); } type.WriteObject(buffer, obj); } else { AmqpEncoding.EncodeNull(buffer); } } return((int)this.Members.Length); }
public void AddSerializableType(Type type, SerializableType serializableType) { this.cache.TryAdd(type, serializableType); }
public void AddSerializableType(Type type, SerializableType serializableType) { this.cache.TryAdd(type, serializableType); }
static SerializableType CompileType(Type type) { // at this point, type is a composite type object[] typeAttributes = type.GetCustomAttributes(typeof(AmqpContractAttribute), true); if (typeAttributes.Length != 1) { throw new NotSupportedException(type.FullName); } AmqpContractAttribute contractAttribute = (AmqpContractAttribute)typeAttributes[0]; string descriptorName = contractAttribute.Name; ulong? descriptorCode = contractAttribute.InternalCode; if (descriptorName == null && descriptorCode == null) { descriptorName = type.FullName; } int lastOrder = 0; SortedList <int, SerialiableMember> memberList = new SortedList <int, SerialiableMember>(); MemberInfo[] memberInfos = type.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (MemberInfo memberInfo in memberInfos) { if (memberInfo.DeclaringType != type || (memberInfo.MemberType != MemberTypes.Field && memberInfo.MemberType != MemberTypes.Property)) { continue; } object[] memberAttributes = memberInfo.GetCustomAttributes(typeof(AmqpMemberAttribute), true); if (memberAttributes.Length != 1) { continue; } AmqpMemberAttribute attribute = (AmqpMemberAttribute)memberAttributes[0]; SerialiableMember member = new SerialiableMember(); member.Name = attribute.Name ?? memberInfo.Name; member.Order = attribute.InternalOrder ?? lastOrder; member.Mandatory = attribute.Mandatory; member.Accessor = MemberAccessor.Create(memberInfo); // This will recursively resolve member types Type memberType = memberInfo.MemberType == MemberTypes.Field ? ((FieldInfo)memberInfo).FieldType : ((PropertyInfo)memberInfo).PropertyType; member.Type = GetType(memberType); memberList.Add(member.Order, member); lastOrder = member.Order >= lastOrder ? member.Order + 1 : lastOrder + 1; } SerialiableMember[] members = new SerialiableMember[memberList.Count]; for (int i = 0; i < memberList.Count; ++i) { members[i] = memberList[i]; } SerializableType serializableType = SerializableType.Create(type, descriptorName, descriptorCode, members); return(serializableType); }
public AmqpContractSerializer(Type type) { this.type = GetType(type); }
public ListType(AmqpContractSerializer serializer, Type type, Type itemType, MethodAccessor addAccessor) : base(serializer, type) { this.itemType = serializer.GetType(itemType); this.addMethodAccessor = addAccessor; }
public static SerializableType CreateDescribedMapType(AmqpContractSerializer serializer, Type type, SerializableType baseType, string descriptorName, ulong?descriptorCode, SerialiableMember[] members, Dictionary <Type, SerializableType> knownTypes, MethodAccessor onDesrialized) { return(new SerializableType.DescribedMapType(serializer, type, baseType, descriptorName, descriptorCode, members, knownTypes, onDesrialized)); }
protected override void Initialize(ByteBuffer buffer, FormatCode formatCode, out int size, out int count, out int encodeWidth, out SerializableType.CollectionType effectiveType) { object valueOrDefault; if (formatCode != 0) { throw new AmqpException(AmqpError.InvalidField, SRAmqp.AmqpInvalidFormatCode(formatCode, buffer.Offset)); } effectiveType = null; formatCode = AmqpEncoding.ReadFormatCode(buffer); ulong? nullable = null; AmqpSymbol amqpSymbol = new AmqpSymbol(); if (formatCode == 68) { nullable = new ulong?((ulong)0); } else if (formatCode == 128 || formatCode == 83) { nullable = ULongEncoding.Decode(buffer, formatCode); } else if (formatCode == 163 || formatCode == 179) { amqpSymbol = SymbolEncoding.Decode(buffer, formatCode); } if (this.AreEqual(this.descriptorCode, this.descriptorName, nullable, amqpSymbol)) { effectiveType = this; } else if (this.knownTypes != null) { int num = 0; while (num < (int)this.knownTypes.Length) { KeyValuePair <Type, SerializableType> keyValuePair = this.knownTypes[num]; if (keyValuePair.Value == null) { SerializableType type = this.serializer.GetType(keyValuePair.Key); keyValuePair = new KeyValuePair <Type, SerializableType>(keyValuePair.Key, type); KeyValuePair <Type, SerializableType> keyValuePair1 = keyValuePair; keyValuePair = keyValuePair1; this.knownTypes[num] = keyValuePair1; } SerializableType.DescribedType value = (SerializableType.DescribedType)keyValuePair.Value; if (!this.AreEqual(value.descriptorCode, value.descriptorName, nullable, amqpSymbol)) { num++; } else { effectiveType = value; break; } } } if (effectiveType == null) { ulong?nullable1 = nullable; if (nullable1.HasValue) { valueOrDefault = nullable1.GetValueOrDefault(); } else { valueOrDefault = amqpSymbol.Value; } throw new SerializationException(SRAmqp.AmqpUnknownDescriptor(valueOrDefault, this.type.Name)); } formatCode = AmqpEncoding.ReadFormatCode(buffer); if (this.Code != 208) { encodeWidth = (formatCode == 193 ? 1 : 4); AmqpEncoding.ReadSizeAndCount(buffer, formatCode, 193, 209, out size, out count); return; } if (formatCode == 69) { int num1 = 0; int num2 = num1; encodeWidth = num1; int num3 = num2; int num4 = num3; count = num3; size = num4; return; } encodeWidth = (formatCode == 192 ? 1 : 4); AmqpEncoding.ReadSizeAndCount(buffer, formatCode, 192, 208, out size, out count); }
public DescribedListType(AmqpContractSerializer serializer, Type type, SerializableType baseType, string descriptorName, ulong?descriptorCode, SerialiableMember[] members, Dictionary <Type, SerializableType> knownTypes, MethodAccessor onDesrialized) : base(serializer, type, baseType, descriptorName, descriptorCode, members, knownTypes, onDesrialized) { }
public AmqpContractSerializer(Type type) { this.type = GetType(type); }
private SerializableType CompileType(Type type, bool describedOnly) { int valueOrDefault; object[] customAttributes = type.GetCustomAttributes(typeof(AmqpContractAttribute), false); if ((int)customAttributes.Length == 0) { if (describedOnly) { return(null); } return(this.CompileNonContractTypes(type)); } AmqpContractAttribute amqpContractAttribute = (AmqpContractAttribute)customAttributes[0]; SerializableType serializableType = null; if (type.BaseType != typeof(object)) { serializableType = this.CompileType(type.BaseType, true); if (serializableType != null) { if (serializableType.Encoding != amqpContractAttribute.Encoding) { throw new SerializationException(SRAmqp.AmqpEncodingTypeMismatch(type.Name, amqpContractAttribute.Encoding, type.BaseType.Name, serializableType.Encoding)); } this.customTypeCache.TryAdd(type.BaseType, serializableType); } } string name = amqpContractAttribute.Name; ulong? internalCode = amqpContractAttribute.InternalCode; if (name == null && !internalCode.HasValue) { name = type.FullName; } List <SerialiableMember> serialiableMembers = new List <SerialiableMember>(); if (amqpContractAttribute.Encoding == EncodingType.List && serializableType != null) { serialiableMembers.AddRange(serializableType.Members); } int count = serialiableMembers.Count + 1; MemberInfo[] members = type.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodAccessor methodAccessor = null; MemberInfo[] memberInfoArray = members; for (int i = 0; i < (int)memberInfoArray.Length; i++) { MemberInfo memberInfo = memberInfoArray[i]; if (memberInfo.DeclaringType == type) { if (memberInfo.MemberType == MemberTypes.Field || memberInfo.MemberType == MemberTypes.Property) { object[] objArray = memberInfo.GetCustomAttributes(typeof(AmqpMemberAttribute), true); if ((int)objArray.Length == 1) { AmqpMemberAttribute amqpMemberAttribute = (AmqpMemberAttribute)objArray[0]; SerialiableMember serialiableMember = new SerialiableMember() { Name = amqpMemberAttribute.Name ?? memberInfo.Name }; SerialiableMember serialiableMember1 = serialiableMember; int?internalOrder = amqpMemberAttribute.InternalOrder; if (internalOrder.HasValue) { valueOrDefault = internalOrder.GetValueOrDefault(); } else { valueOrDefault = count; count = valueOrDefault + 1; } serialiableMember1.Order = valueOrDefault; serialiableMember.Mandatory = amqpMemberAttribute.Mandatory; serialiableMember.Accessor = MemberAccessor.Create(memberInfo, true); serialiableMember.Type = this.GetType((memberInfo.MemberType == MemberTypes.Field ? ((FieldInfo)memberInfo).FieldType : ((PropertyInfo)memberInfo).PropertyType)); serialiableMembers.Add(serialiableMember); } } else if (memberInfo.MemberType == MemberTypes.Method && (int)memberInfo.GetCustomAttributes(typeof(OnDeserializedAttribute), false).Length == 1) { methodAccessor = MethodAccessor.Create((MethodInfo)memberInfo); } } } if (amqpContractAttribute.Encoding == EncodingType.List) { serialiableMembers.Sort(AmqpContractSerializer.MemberOrderComparer.Instance); int order = -1; foreach (SerialiableMember serialiableMember2 in serialiableMembers) { if (order > 0 && serialiableMember2.Order == order) { throw new SerializationException(SRAmqp.AmqpDuplicateMemberOrder(order, type.Name)); } order = serialiableMember2.Order; } } SerialiableMember[] array = serialiableMembers.ToArray(); Dictionary <Type, SerializableType> types = null; object[] customAttributes1 = type.GetCustomAttributes(typeof(KnownTypeAttribute), false); for (int j = 0; j < (int)customAttributes1.Length; j++) { KnownTypeAttribute knownTypeAttribute = (KnownTypeAttribute)customAttributes1[j]; if ((int)knownTypeAttribute.Type.GetCustomAttributes(typeof(AmqpContractAttribute), false).Length > 0) { if (types == null) { types = new Dictionary <Type, SerializableType>(); } types.Add(knownTypeAttribute.Type, null); } } if (amqpContractAttribute.Encoding == EncodingType.List) { return(SerializableType.CreateDescribedListType(this, type, serializableType, name, internalCode, array, types, methodAccessor)); } if (amqpContractAttribute.Encoding != EncodingType.Map) { throw new NotSupportedException(amqpContractAttribute.Encoding.ToString()); } return(SerializableType.CreateDescribedMapType(this, type, serializableType, name, internalCode, array, types, methodAccessor)); }