http://git-wip-us.apache.org/repos/asf/ignite/blob/f65a53e4/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSystemHandlers.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSystemHandlers.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSystemHandlers.cs index 6b5e20d..ff3fb85 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSystemHandlers.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSystemHandlers.cs @@ -19,7 +19,6 @@ namespace Apache.Ignite.Core.Impl.Portable { using System; using System.Collections; - using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; @@ -33,15 +32,6 @@ namespace Apache.Ignite.Core.Impl.Portable /// <param name="obj">Object to write.</param> internal delegate void PortableSystemWriteDelegate(PortableWriterImpl writer, object obj); - /// <summary> - /// Typed write delegate. - /// </summary> - /// <param name="stream">Stream.</param> - /// <param name="obj">Object to write.</param> - // ReSharper disable once TypeParameterCanBeVariant - // Generic variance in a delegate causes performance hit - internal delegate void PortableSystemTypedWriteDelegate<T>(IPortableStream stream, T obj); - /** * <summary>Collection of predefined handlers for various system types.</summary> */ @@ -57,20 +47,6 @@ namespace Apache.Ignite.Core.Impl.Portable /** Read handlers. */ private static readonly IPortableSystemReader[] ReadHandlers = new IPortableSystemReader[255]; - /** Write handler: collection. */ - public static readonly PortableSystemWriteDelegate WriteHndCollection = WriteCollection; - - /** Write handler: dictionary. */ - public static readonly PortableSystemWriteDelegate WriteHndDictionary = WriteDictionary; - - /** Write handler: generic collection. */ - public static readonly PortableSystemWriteDelegate WriteHndGenericCollection = - WriteGenericCollection; - - /** Write handler: generic dictionary. */ - public static readonly PortableSystemWriteDelegate WriteHndGenericDictionary = - WriteGenericDictionary; - /// <summary> /// Initializes the <see cref="PortableSystemHandlers"/> class. /// </summary> @@ -132,21 +108,21 @@ namespace Apache.Ignite.Core.Impl.Portable new PortableSystemReader<DateTime?[]>(s => PortableUtils.ReadDateArray(s, false)); // 7. String array. - ReadHandlers[PortableUtils.TypeArrayString] = new PortableSystemGenericArrayReader<string>(); + ReadHandlers[PortableUtils.TypeArrayString] = new PortableSystemTypedArrayReader<string>(); // 8. Guid array. - ReadHandlers[PortableUtils.TypeArrayGuid] = new PortableSystemGenericArrayReader<Guid?>(); + ReadHandlers[PortableUtils.TypeArrayGuid] = new PortableSystemTypedArrayReader<Guid?>(); // 9. Array. ReadHandlers[PortableUtils.TypeArray] = new PortableSystemReader(ReadArray); - // 12. Arbitrary collection. + // 11. Arbitrary collection. ReadHandlers[PortableUtils.TypeCollection] = new PortableSystemReader(ReadCollection); // 13. Arbitrary dictionary. ReadHandlers[PortableUtils.TypeDictionary] = new PortableSystemReader(ReadDictionary); - // 14. Map entry. + // 15. Map entry. ReadHandlers[PortableUtils.TypeMapEntry] = new PortableSystemReader(ReadMapEntry); // 16. Enum. @@ -168,17 +144,14 @@ namespace Apache.Ignite.Core.Impl.Portable // Have we ever met this type? if (writeHandlers0 != null && writeHandlers0.TryGetValue(type, out res)) return res; - else - { - // Determine write handler for type and add it. - res = FindWriteHandler(type); - if (res != null) - AddWriteHandler(type, res); + // Determine write handler for type and add it. + res = FindWriteHandler(type); - return res; - } + if (res != null) + AddWriteHandler(type, res); + return res; } /// <summary> @@ -191,21 +164,21 @@ namespace Apache.Ignite.Core.Impl.Portable // 1. Well-known types. if (type == typeof (string)) return WriteString; - else if (type == typeof(decimal)) + if (type == typeof(decimal)) return WriteDecimal; - else if (type == typeof(DateTime)) + if (type == typeof(DateTime)) return WriteDate; - else if (type == typeof(Guid)) + if (type == typeof(Guid)) return WriteGuid; - else if (type == typeof (PortableUserObject)) + if (type == typeof (PortableUserObject)) return WritePortable; - else if (type == typeof (ArrayList)) + if (type == typeof (ArrayList)) return WriteArrayList; - else if (type == typeof(Hashtable)) + if (type == typeof(Hashtable)) return WriteHashtable; - else if (type == typeof(DictionaryEntry)) + if (type == typeof(DictionaryEntry)) return WriteMapEntry; - else if (type.IsArray) + if (type.IsArray) { // We know how to write any array type. Type elemType = type.GetElementType(); @@ -213,62 +186,56 @@ namespace Apache.Ignite.Core.Impl.Portable // Primitives. if (elemType == typeof (bool)) return WriteBoolArray; - else if (elemType == typeof(byte)) + if (elemType == typeof(byte)) return WriteByteArray; - else if (elemType == typeof(short)) + if (elemType == typeof(short)) return WriteShortArray; - else if (elemType == typeof(char)) + if (elemType == typeof(char)) return WriteCharArray; - else if (elemType == typeof(int)) + if (elemType == typeof(int)) return WriteIntArray; - else if (elemType == typeof(long)) + if (elemType == typeof(long)) return WriteLongArray; - else if (elemType == typeof(float)) + if (elemType == typeof(float)) return WriteFloatArray; - else if (elemType == typeof(double)) + if (elemType == typeof(double)) return WriteDoubleArray; // Non-CLS primitives. - else if (elemType == typeof(sbyte)) + if (elemType == typeof(sbyte)) return WriteSbyteArray; - else if (elemType == typeof(ushort)) + if (elemType == typeof(ushort)) return WriteUshortArray; - else if (elemType == typeof(uint)) + if (elemType == typeof(uint)) return WriteUintArray; - else if (elemType == typeof(ulong)) + if (elemType == typeof(ulong)) return WriteUlongArray; // Special types. else if (elemType == typeof (decimal?)) return WriteDecimalArray; - else if (elemType == typeof(string)) + if (elemType == typeof(string)) return WriteStringArray; // else if (elemType == typeof(DateTime)) // return WriteDateArray; - else if (elemType == typeof(DateTime?)) + if (elemType == typeof(DateTime?)) return WriteNullableDateArray; // else if (elemType == typeof(Guid)) // return WriteGuidArray; - else if (elemType == typeof(Guid?)) + if (elemType == typeof(Guid?)) return WriteNullableGuidArray; // Enums. if (elemType.IsEnum) return WriteEnumArray; - // Regular array. - return WriteArray; + // Object array. + if (elemType == typeof (object)) + return WriteArray; } - else if (type.IsEnum) + + if (type.IsEnum) // We know how to write enums. return WriteEnum; - else - { - // We know how to write collections. - PortableCollectionInfo info = PortableCollectionInfo.Info(type); - - if (info.IsAny) - return info.WriteHandler; - return null; - } + return null; } /// <summary> @@ -584,7 +551,7 @@ namespace Apache.Ignite.Core.Impl.Portable { ctx.Stream.WriteByte(PortableUtils.TypeArrayEnum); - PortableUtils.WriteArray((Array)obj, ctx, true); + PortableUtils.WriteArray((Array)obj, ctx); } /** @@ -594,55 +561,7 @@ namespace Apache.Ignite.Core.Impl.Portable { ctx.Stream.WriteByte(PortableUtils.TypeArray); - PortableUtils.WriteArray((Array)obj, ctx, true); - } - - /** - * <summary>Write collection.</summary> - */ - private static void WriteCollection(PortableWriterImpl ctx, object obj) - { - ctx.Stream.WriteByte(PortableUtils.TypeCollection); - - PortableUtils.WriteCollection((ICollection)obj, ctx); - } - - /** - * <summary>Write generic collection.</summary> - */ - private static void WriteGenericCollection(PortableWriterImpl ctx, object obj) - { - PortableCollectionInfo info = PortableCollectionInfo.Info(obj.GetType()); - - Debug.Assert(info.IsGenericCollection, "Not generic collection: " + obj.GetType().FullName); - - ctx.Stream.WriteByte(PortableUtils.TypeCollection); - - info.WriteGeneric(ctx, obj); - } - - /** - * <summary>Write dictionary.</summary> - */ - private static void WriteDictionary(PortableWriterImpl ctx, object obj) - { - ctx.Stream.WriteByte(PortableUtils.TypeDictionary); - - PortableUtils.WriteDictionary((IDictionary)obj, ctx); - } - - /** - * <summary>Write generic dictionary.</summary> - */ - private static void WriteGenericDictionary(PortableWriterImpl ctx, object obj) - { - PortableCollectionInfo info = PortableCollectionInfo.Info(obj.GetType()); - - Debug.Assert(info.IsGenericDictionary, "Not generic dictionary: " + obj.GetType().FullName); - - ctx.Stream.WriteByte(PortableUtils.TypeDictionary); - - info.WriteGeneric(ctx, obj); + PortableUtils.WriteArray((Array)obj, ctx); } /** @@ -652,7 +571,7 @@ namespace Apache.Ignite.Core.Impl.Portable { ctx.Stream.WriteByte(PortableUtils.TypeCollection); - PortableUtils.WriteTypedCollection((ICollection)obj, ctx, PortableUtils.CollectionArrayList); + PortableUtils.WriteCollection((ICollection)obj, ctx, PortableUtils.CollectionArrayList); } /** @@ -662,7 +581,7 @@ namespace Apache.Ignite.Core.Impl.Portable { ctx.Stream.WriteByte(PortableUtils.TypeDictionary); - PortableUtils.WriteTypedDictionary((IDictionary)obj, ctx, PortableUtils.MapHashMap); + PortableUtils.WriteDictionary((IDictionary)obj, ctx, PortableUtils.MapHashMap); } /** @@ -700,7 +619,7 @@ namespace Apache.Ignite.Core.Impl.Portable */ private static object ReadEnumArray(PortableReaderImpl ctx, Type type) { - return PortableUtils.ReadArray(ctx, true, type.GetElementType()); + return PortableUtils.ReadTypedArray(ctx, true, type.GetElementType()); } /** @@ -710,7 +629,7 @@ namespace Apache.Ignite.Core.Impl.Portable { var elemType = type.IsArray ? type.GetElementType() : typeof(object); - return PortableUtils.ReadArray(ctx, true, elemType); + return PortableUtils.ReadTypedArray(ctx, true, elemType); } /** @@ -718,11 +637,7 @@ namespace Apache.Ignite.Core.Impl.Portable */ private static object ReadCollection(PortableReaderImpl ctx, Type type) { - PortableCollectionInfo info = PortableCollectionInfo.Info(type); - - return info.IsGenericCollection - ? info.ReadGeneric(ctx) - : PortableUtils.ReadCollection(ctx, null, null); + return PortableUtils.ReadCollection(ctx, null, null); } /** @@ -730,11 +645,7 @@ namespace Apache.Ignite.Core.Impl.Portable */ private static object ReadDictionary(PortableReaderImpl ctx, Type type) { - PortableCollectionInfo info = PortableCollectionInfo.Info(type); - - return info.IsGenericDictionary - ? info.ReadGeneric(ctx) - : PortableUtils.ReadDictionary(ctx, null); + return PortableUtils.ReadDictionary(ctx, null); } /** @@ -746,104 +657,10 @@ namespace Apache.Ignite.Core.Impl.Portable } /** - * <summary>Create new ArrayList.</summary> - * <param name="len">Length.</param> - * <returns>ArrayList.</returns> - */ - public static ICollection CreateArrayList(int len) - { - return new ArrayList(len); - } - - /** * <summary>Add element to array list.</summary> * <param name="col">Array list.</param> * <param name="elem">Element.</param> */ - public static void AddToArrayList(ICollection col, object elem) - { - ((ArrayList) col).Add(elem); - } - - /** - * <summary>Create new List.</summary> - * <param name="len">Length.</param> - * <returns>List.</returns> - */ - public static ICollection<T> CreateList<T>(int len) - { - return new List<T>(len); - } - - /** - * <summary>Create new LinkedList.</summary> - * <param name="len">Length.</param> - * <returns>LinkedList.</returns> - */ - public static ICollection<T> CreateLinkedList<T>(int len) - { - return new LinkedList<T>(); - } - - /** - * <summary>Create new HashSet.</summary> - * <param name="len">Length.</param> - * <returns>HashSet.</returns> - */ - public static ICollection<T> CreateHashSet<T>(int len) - { - return new HashSet<T>(); - } - - /** - * <summary>Create new SortedSet.</summary> - * <param name="len">Length.</param> - * <returns>SortedSet.</returns> - */ - public static ICollection<T> CreateSortedSet<T>(int len) - { - return new SortedSet<T>(); - } - - /** - * <summary>Create new Hashtable.</summary> - * <param name="len">Length.</param> - * <returns>Hashtable.</returns> - */ - public static IDictionary CreateHashtable(int len) - { - return new Hashtable(len); - } - - /** - * <summary>Create new Dictionary.</summary> - * <param name="len">Length.</param> - * <returns>Dictionary.</returns> - */ - public static IDictionary<TK, TV> CreateDictionary<TK, TV>(int len) - { - return new Dictionary<TK, TV>(len); - } - - /** - * <summary>Create new SortedDictionary.</summary> - * <param name="len">Length.</param> - * <returns>SortedDictionary.</returns> - */ - public static IDictionary<TK, TV> CreateSortedDictionary<TK, TV>(int len) - { - return new SortedDictionary<TK, TV>(); - } - - /** - * <summary>Create new ConcurrentDictionary.</summary> - * <param name="len">Length.</param> - * <returns>ConcurrentDictionary.</returns> - */ - public static IDictionary<TK, TV> CreateConcurrentDictionary<TK, TV>(int len) - { - return new ConcurrentDictionary<TK, TV>(Environment.ProcessorCount, len); - } /** @@ -930,11 +747,11 @@ namespace Apache.Ignite.Core.Impl.Portable /// <summary> /// Reader without boxing. /// </summary> - private class PortableSystemGenericArrayReader<T> : IPortableSystemReader + private class PortableSystemTypedArrayReader<T> : IPortableSystemReader { public TResult Read<TResult>(PortableReaderImpl ctx) { - return TypeCaster<TResult>.Cast(PortableUtils.ReadGenericArray<T>(ctx, false)); + return TypeCaster<TResult>.Cast(PortableUtils.ReadArray<T>(ctx, false)); } }
http://git-wip-us.apache.org/repos/asf/ignite/blob/f65a53e4/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableUtils.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableUtils.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableUtils.cs index ed8d5e1..26cf5b5 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableUtils.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableUtils.cs @@ -170,15 +170,6 @@ namespace Apache.Ignite.Core.Impl.Portable /** Type: native job result holder. */ public const byte TypePortableJobResHolder = 76; - /** Type: .Net configuration. */ - public const byte TypeDotNetCfg = 202; - - /** Type: .Net portable configuration. */ - public const byte TypeDotNetPortableCfg = 203; - - /** Type: .Net portable type configuration. */ - public const byte TypeDotNetPortableTypCfg = 204; - /** Type: Ignite proxy. */ public const byte TypeIgniteProxy = 74; @@ -212,9 +203,6 @@ namespace Apache.Ignite.Core.Impl.Portable /** Type: entry predicate holder. */ public const byte TypeCacheEntryPredicateHolder = 90; - /** Type: product license. */ - public const byte TypeProductLicense = 78; - /** Type: message filter holder. */ public const byte TypeMessageListenerHolder = 92; @@ -284,12 +272,6 @@ namespace Apache.Ignite.Core.Impl.Portable /** Dictionary type. */ public static readonly Type TypDictionary = typeof(IDictionary); - /** Generic collection type. */ - public static readonly Type TypGenericCollection = typeof(ICollection<>); - - /** Generic dictionary type. */ - public static readonly Type TypGenericDictionary = typeof(IDictionary<,>); - /** Ticks for Java epoch. */ private static readonly long JavaDateTicks = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks; @@ -300,25 +282,9 @@ namespace Apache.Ignite.Core.Impl.Portable /** Default poratble marshaller. */ private static readonly PortableMarshaller Marsh = new PortableMarshaller(null); - /** Method: WriteGenericCollection. */ - public static readonly MethodInfo MtdhWriteGenericCollection = - typeof(PortableUtils).GetMethod("WriteGenericCollection", _bindFlagsStatic); - - /** Method: ReadGenericCollection. */ - public static readonly MethodInfo MtdhReadGenericCollection = - typeof(PortableUtils).GetMethod("ReadGenericCollection", _bindFlagsStatic); - - /** Method: WriteGenericDictionary. */ - public static readonly MethodInfo MtdhWriteGenericDictionary = - typeof(PortableUtils).GetMethod("WriteGenericDictionary", _bindFlagsStatic); - - /** Method: ReadGenericDictionary. */ - public static readonly MethodInfo MtdhReadGenericDictionary = - typeof(PortableUtils).GetMethod("ReadGenericDictionary", _bindFlagsStatic); - - /** Method: ReadGenericArray. */ - public static readonly MethodInfo MtdhReadGenericArray = - typeof(PortableUtils).GetMethod("ReadGenericArray", _bindFlagsStatic); + /** Method: ReadArray. */ + public static readonly MethodInfo MtdhReadArray = + typeof(PortableUtils).GetMethod("ReadArray", _bindFlagsStatic); /** Cached UTF8 encoding. */ private static readonly Encoding Utf8 = Encoding.UTF8; @@ -1006,7 +972,7 @@ namespace Apache.Ignite.Core.Impl.Portable var vals = new decimal?[len]; for (int i = 0; i < len; i++) - vals[i] = stream.ReadByte() == HdrNull ? (decimal?) null : ReadDecimal(stream); + vals[i] = stream.ReadByte() == HdrNull ? null : ReadDecimal(stream); return vals; } @@ -1098,19 +1064,17 @@ namespace Apache.Ignite.Core.Impl.Portable return vals; } - + /// <summary> /// Write array. /// </summary> /// <param name="val">Array.</param> /// <param name="ctx">Write context.</param> - /// <param name="typed">Typed flag.</param> - public static void WriteArray(Array val, PortableWriterImpl ctx, bool typed) + public static void WriteArray(Array val, PortableWriterImpl ctx) { IPortableStream stream = ctx.Stream; - if (typed) - stream.WriteInt(ObjTypeId); + stream.WriteInt(ObjTypeId); stream.WriteInt(val.Length); @@ -1125,14 +1089,14 @@ namespace Apache.Ignite.Core.Impl.Portable /// <param name="typed">Typed flag.</param> /// <param name="elementType">Type of the element.</param> /// <returns>Array.</returns> - public static object ReadArray(PortableReaderImpl ctx, bool typed, Type elementType) + public static object ReadTypedArray(PortableReaderImpl ctx, bool typed, Type elementType) { Func<PortableReaderImpl, bool, object> result; if (!ArrayReaders.TryGetValue(elementType, out result)) result = ArrayReaders.GetOrAdd(elementType, t => DelegateConverter.CompileFunc<Func<PortableReaderImpl, bool, object>>(null, - MtdhReadGenericArray.MakeGenericMethod(t), + MtdhReadArray.MakeGenericMethod(t), new[] {typeof (PortableReaderImpl), typeof (bool)}, new[] {false, false, true})); return result(ctx, typed); @@ -1144,9 +1108,9 @@ namespace Apache.Ignite.Core.Impl.Portable /// <param name="ctx">Read context.</param> /// <param name="typed">Typed flag.</param> /// <returns>Array.</returns> - public static T[] ReadGenericArray<T>(PortableReaderImpl ctx, bool typed) + public static T[] ReadArray<T>(PortableReaderImpl ctx, bool typed) { - IPortableStream stream = ctx.Stream; + var stream = ctx.Stream; if (typed) stream.ReadInt(); @@ -1186,9 +1150,29 @@ namespace Apache.Ignite.Core.Impl.Portable */ public static void WriteCollection(ICollection val, PortableWriterImpl ctx) { - byte colType = val.GetType() == typeof(ArrayList) ? CollectionArrayList : CollectionCustom; + var valType = val.GetType(); + + byte colType; - WriteTypedCollection(val, ctx, colType); + if (valType.IsGenericType) + { + var genType = valType.GetGenericTypeDefinition(); + + if (genType == typeof (List<>)) + colType = CollectionArrayList; + else if (genType == typeof (LinkedList<>)) + colType = CollectionLinkedList; + else if (genType == typeof (SortedSet<>)) + colType = CollectionSortedSet; + else if (genType == typeof (ConcurrentBag<>)) + colType = CollectionConcurrentBag; + else + colType = CollectionCustom; + } + else + colType = valType == typeof (ArrayList) ? CollectionArrayList : CollectionCustom; + + WriteCollection(val, ctx, colType); } /** @@ -1197,7 +1181,7 @@ namespace Apache.Ignite.Core.Impl.Portable * <param name="ctx">Write context.</param> * <param name="colType">Collection type.</param> */ - public static void WriteTypedCollection(ICollection val, PortableWriterImpl ctx, byte colType) + public static void WriteCollection(ICollection val, PortableWriterImpl ctx, byte colType) { ctx.Stream.WriteInt(val.Count); @@ -1217,19 +1201,30 @@ namespace Apache.Ignite.Core.Impl.Portable public static ICollection ReadCollection(PortableReaderImpl ctx, PortableCollectionFactory factory, PortableCollectionAdder adder) { - if (factory == null) - factory = PortableSystemHandlers.CreateArrayList; - - if (adder == null) - adder = PortableSystemHandlers.AddToArrayList; - IPortableStream stream = ctx.Stream; int len = stream.ReadInt(); - ctx.Stream.Seek(1, SeekOrigin.Current); + byte colType = ctx.Stream.ReadByte(); - ICollection res = factory.Invoke(len); + ICollection res; + + if (factory == null) + { + if (colType == CollectionLinkedList) + res = new LinkedList<object>(); + else if (colType == CollectionSortedSet) + res = new SortedSet<object>(); + else if (colType == CollectionConcurrentBag) + res = new ConcurrentBag<object>(); + else + res = new ArrayList(len); + } + else + res = factory.Invoke(len); + + if (adder == null) + adder = (col, elem) => { ((ArrayList) col).Add(elem); }; for (int i = 0; i < len; i++) adder.Invoke(res, ctx.Deserialize<object>()); @@ -1238,95 +1233,33 @@ namespace Apache.Ignite.Core.Impl.Portable } /** - * <summary>Write generic collection.</summary> - * <param name="val">Value.</param> - * <param name="ctx">Write context.</param> - */ - public static void WriteGenericCollection<T>(ICollection<T> val, PortableWriterImpl ctx) - { - Type type = val.GetType().GetGenericTypeDefinition(); - - byte colType; - - if (type == typeof(List<>)) - colType = CollectionArrayList; - else if (type == typeof(LinkedList<>)) - colType = CollectionLinkedList; - else if (type == typeof(HashSet<>)) - colType = CollectionHashSet; - else if (type == typeof(SortedSet<>)) - colType = CollectionSortedSet; - else - colType = CollectionCustom; - - WriteTypedGenericCollection(val, ctx, colType); - } - - /** - * <summary>Write generic non-null collection with known type.</summary> + * <summary>Write dictionary.</summary> * <param name="val">Value.</param> * <param name="ctx">Write context.</param> - * <param name="colType">Collection type.</param> */ - public static void WriteTypedGenericCollection<T>(ICollection<T> val, PortableWriterImpl ctx, - byte colType) + public static void WriteDictionary(IDictionary val, PortableWriterImpl ctx) { - ctx.Stream.WriteInt(val.Count); - - ctx.Stream.WriteByte(colType); + var valType = val.GetType(); - foreach (T elem in val) - ctx.Write(elem); - } - - /** - * <summary>Read generic collection.</summary> - * <param name="ctx">Context.</param> - * <param name="factory">Factory delegate.</param> - * <returns>Collection.</returns> - */ - public static ICollection<T> ReadGenericCollection<T>(PortableReaderImpl ctx, - PortableGenericCollectionFactory<T> factory) - { - int len = ctx.Stream.ReadInt(); + byte dictType; - if (len >= 0) + if (valType.IsGenericType) { - byte colType = ctx.Stream.ReadByte(); - - if (factory == null) - { - // Need to detect factory automatically. - if (colType == CollectionLinkedList) - factory = PortableSystemHandlers.CreateLinkedList<T>; - else if (colType == CollectionHashSet) - factory = PortableSystemHandlers.CreateHashSet<T>; - else if (colType == CollectionSortedSet) - factory = PortableSystemHandlers.CreateSortedSet<T>; - else - factory = PortableSystemHandlers.CreateList<T>; - } - - ICollection<T> res = factory.Invoke(len); - - for (int i = 0; i < len; i++) - res.Add(ctx.Deserialize<T>()); - - return res; + var genType = valType.GetGenericTypeDefinition(); + + if (genType == typeof (Dictionary<,>)) + dictType = MapHashMap; + else if (genType == typeof (SortedDictionary<,>)) + dictType = MapSortedMap; + else if (genType == typeof (ConcurrentDictionary<,>)) + dictType = MapConcurrentHashMap; + else + dictType = MapCustom; } - return null; - } - - /** - * <summary>Write dictionary.</summary> - * <param name="val">Value.</param> - * <param name="ctx">Write context.</param> - */ - public static void WriteDictionary(IDictionary val, PortableWriterImpl ctx) - { - byte dictType = val.GetType() == typeof(Hashtable) ? MapHashMap : MapCustom; + else + dictType = valType == typeof (Hashtable) ? MapHashMap : MapCustom; - WriteTypedDictionary(val, ctx, dictType); + WriteDictionary(val, ctx, dictType); } /** @@ -1335,7 +1268,7 @@ namespace Apache.Ignite.Core.Impl.Portable * <param name="ctx">Write context.</param> * <param name="dictType">Dictionary type.</param> */ - public static void WriteTypedDictionary(IDictionary val, PortableWriterImpl ctx, byte dictType) + public static void WriteDictionary(IDictionary val, PortableWriterImpl ctx, byte dictType) { ctx.Stream.WriteInt(val.Count); @@ -1357,16 +1290,26 @@ namespace Apache.Ignite.Core.Impl.Portable public static IDictionary ReadDictionary(PortableReaderImpl ctx, PortableDictionaryFactory factory) { - if (factory == null) - factory = PortableSystemHandlers.CreateHashtable; - IPortableStream stream = ctx.Stream; int len = stream.ReadInt(); - ctx.Stream.Seek(1, SeekOrigin.Current); + byte colType = ctx.Stream.ReadByte(); + + IDictionary res; + + if (factory == null) + { + if (colType == MapSortedMap) + res = new SortedDictionary<object, object>(); + else if (colType == MapConcurrentHashMap) + res = new ConcurrentDictionary<object, object>(Environment.ProcessorCount, len); + else + res = new Hashtable(len); + } + else + res = factory.Invoke(len); - IDictionary res = factory.Invoke(len); for (int i = 0; i < len; i++) { @@ -1380,89 +1323,6 @@ namespace Apache.Ignite.Core.Impl.Portable } /** - * <summary>Write generic dictionary.</summary> - * <param name="val">Value.</param> - * <param name="ctx">Write context.</param> - */ - public static void WriteGenericDictionary<TK, TV>(IDictionary<TK, TV> val, PortableWriterImpl ctx) - { - Type type = val.GetType().GetGenericTypeDefinition(); - - byte dictType; - - if (type == typeof(Dictionary<,>)) - dictType = MapHashMap; - else if (type == typeof(SortedDictionary<,>)) - dictType = MapSortedMap; - else if (type == typeof(ConcurrentDictionary<,>)) - dictType = MapConcurrentHashMap; - else - dictType = MapCustom; - - WriteTypedGenericDictionary(val, ctx, dictType); - } - - /** - * <summary>Write generic non-null dictionary with known type.</summary> - * <param name="val">Value.</param> - * <param name="ctx">Write context.</param> - * <param name="dictType">Dictionary type.</param> - */ - public static void WriteTypedGenericDictionary<TK, TV>(IDictionary<TK, TV> val, - PortableWriterImpl ctx, byte dictType) - { - ctx.Stream.WriteInt(val.Count); - - ctx.Stream.WriteByte(dictType); - - foreach (KeyValuePair<TK, TV> entry in val) - { - ctx.Write(entry.Key); - ctx.Write(entry.Value); - } - } - - /** - * <summary>Read generic dictionary.</summary> - * <param name="ctx">Context.</param> - * <param name="factory">Factory delegate.</param> - * <returns>Collection.</returns> - */ - public static IDictionary<TK, TV> ReadGenericDictionary<TK, TV>(PortableReaderImpl ctx, - PortableGenericDictionaryFactory<TK, TV> factory) - { - int len = ctx.Stream.ReadInt(); - - if (len >= 0) - { - byte colType = ctx.Stream.ReadByte(); - - if (factory == null) - { - if (colType == MapSortedMap) - factory = PortableSystemHandlers.CreateSortedDictionary<TK, TV>; - else if (colType == MapConcurrentHashMap) - factory = PortableSystemHandlers.CreateConcurrentDictionary<TK, TV>; - else - factory = PortableSystemHandlers.CreateDictionary<TK, TV>; - } - - IDictionary<TK, TV> res = factory.Invoke(len); - - for (int i = 0; i < len; i++) - { - TK key = ctx.Deserialize<TK>(); - TV val = ctx.Deserialize<TV>(); - - res[key] = val; - } - - return res; - } - return null; - } - - /** * <summary>Write map entry.</summary> * <param name="ctx">Write context.</param> * <param name="val">Value.</param> http://git-wip-us.apache.org/repos/asf/ignite/blob/f65a53e4/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs index ffa475e..b75292f 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs @@ -867,7 +867,7 @@ namespace Apache.Ignite.Core.Impl.Portable int pos = SkipFieldLength(); _stream.WriteByte(PU.TypeArrayEnum); - PortableUtils.WriteArray(val, this, true); + PortableUtils.WriteArray(val, this); WriteFieldLength(_stream, pos); } @@ -885,7 +885,7 @@ namespace Apache.Ignite.Core.Impl.Portable else { _stream.WriteByte(PU.TypeArrayEnum); - PortableUtils.WriteArray(val, this, true); + PortableUtils.WriteArray(val, this); } } @@ -924,10 +924,10 @@ namespace Apache.Ignite.Core.Impl.Portable /// <summary> /// Write named object array. /// </summary> - /// <typeparam name="T"></typeparam> + /// <typeparam name="T">Element type.</typeparam> /// <param name="fieldName">Field name.</param> /// <param name="val">Object array.</param> - public void WriteObjectArray<T>(string fieldName, T[] val) + public void WriteArray<T>(string fieldName, T[] val) { WriteFieldId(fieldName, PU.TypeArray); @@ -938,7 +938,7 @@ namespace Apache.Ignite.Core.Impl.Portable int pos = SkipFieldLength(); _stream.WriteByte(PU.TypeArray); - PortableUtils.WriteArray(val, this, true); + PortableUtils.WriteArray(val, this); WriteFieldLength(_stream, pos); } @@ -947,16 +947,16 @@ namespace Apache.Ignite.Core.Impl.Portable /// <summary> /// Write object array. /// </summary> - /// <typeparam name="T"></typeparam> + /// <typeparam name="T">Element type.</typeparam> /// <param name="val">Object array.</param> - public void WriteObjectArray<T>(T[] val) + public void WriteArray<T>(T[] val) { if (val == null) WriteNullRawField(); else { _stream.WriteByte(PU.TypeArray); - PortableUtils.WriteArray(val, this, true); + PortableUtils.WriteArray(val, this); } } @@ -975,7 +975,7 @@ namespace Apache.Ignite.Core.Impl.Portable { int pos = SkipFieldLength(); - Write(val); + WriteCollection(val); WriteFieldLength(_stream, pos); } @@ -987,39 +987,8 @@ namespace Apache.Ignite.Core.Impl.Portable /// <param name="val">Collection.</param> public void WriteCollection(ICollection val) { - Write(val); - } - - /// <summary> - /// Write named generic collection. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="fieldName">Field name.</param> - /// <param name="val">Collection.</param> - public void WriteGenericCollection<T>(string fieldName, ICollection<T> val) - { - WriteFieldId(fieldName, PU.TypeCollection); - - if (val == null) - WriteNullField(); - else - { - int pos = SkipFieldLength(); - - Write(val); - - WriteFieldLength(_stream, pos); - } - } - - /// <summary> - /// Write generic collection. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="val">Collection.</param> - public void WriteGenericCollection<T>(ICollection<T> val) - { - Write(val); + WriteByte(PU.TypeCollection); + PU.WriteCollection(val, this); } /// <summary> @@ -1037,7 +1006,7 @@ namespace Apache.Ignite.Core.Impl.Portable { int pos = SkipFieldLength(); - Write(val); + WriteDictionary(val); WriteFieldLength(_stream, pos); } @@ -1049,37 +1018,8 @@ namespace Apache.Ignite.Core.Impl.Portable /// <param name="val">Dictionary.</param> public void WriteDictionary(IDictionary val) { - Write(val); - } - - /// <summary> - /// Write named generic dictionary. - /// </summary> - /// <param name="fieldName">Field name.</param> - /// <param name="val">Dictionary.</param> - public void WriteGenericDictionary<TK, TV>(string fieldName, IDictionary<TK, TV> val) - { - WriteFieldId(fieldName, PU.TypeDictionary); - - if (val == null) - WriteNullField(); - else - { - int pos = SkipFieldLength(); - - Write(val); - - WriteFieldLength(_stream, pos); - } - } - - /// <summary> - /// Write generic dictionary. - /// </summary> - /// <param name="val">Dictionary.</param> - public void WriteGenericDictionary<TK, TV>(IDictionary<TK, TV> val) - { - Write(val); + WriteByte(PU.TypeDictionary); + PU.WriteDictionary(val, this); } /// <summary> @@ -1118,7 +1058,7 @@ namespace Apache.Ignite.Core.Impl.Portable /// </summary> /// <param name="builder">Builder.</param> /// <returns>Previous builder.</returns> - internal PortableBuilderImpl Builder(PortableBuilderImpl builder) + internal PortableBuilderImpl SetBuilder(PortableBuilderImpl builder) { PortableBuilderImpl ret = _builder; @@ -1239,11 +1179,10 @@ namespace Apache.Ignite.Core.Impl.Portable handler.Invoke(this, obj); else { - // Last chance: is object seializable? if (type.IsSerializable) Write(new SerializableObjectHolder(obj)); else - // We did our best, object cannot be marshalled. + // We did our best, object cannot be marshalled. throw new PortableException("Unsupported object type [type=" + type + ", object=" + obj + ']'); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/f65a53e4/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs index a3e8dd5..f0408a8 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs @@ -19,7 +19,6 @@ namespace Apache.Ignite.Core.Portable { using System; using System.Collections; - using System.Collections.Generic; /// <summary> /// Raw reader for portable objects. @@ -206,10 +205,10 @@ namespace Apache.Ignite.Core.Portable /// Read object array. /// </summary> /// <returns>Object array.</returns> - T[] ReadObjectArray<T>(); + T[] ReadArray<T>(); /// <summary> - /// Read collection. + /// Read collection. /// </summary> /// <returns>Collection.</returns> ICollection ReadCollection(); @@ -223,19 +222,6 @@ namespace Apache.Ignite.Core.Portable ICollection ReadCollection(PortableCollectionFactory factory, PortableCollectionAdder adder); /// <summary> - /// Read generic collection. - /// </summary> - /// <returns>Collection.</returns> - ICollection<T> ReadGenericCollection<T>(); - - /// <summary> - /// Read generic collection. - /// </summary> - /// <param name="factory">Factory.</param> - /// <returns>Collection.</returns> - ICollection<T> ReadGenericCollection<T>(PortableGenericCollectionFactory<T> factory); - - /// <summary> /// Read dictionary. /// </summary> /// <returns>Dictionary.</returns> @@ -247,18 +233,5 @@ namespace Apache.Ignite.Core.Portable /// <param name="factory">Factory.</param> /// <returns>Dictionary.</returns> IDictionary ReadDictionary(PortableDictionaryFactory factory); - - /// <summary> - /// Read generic dictionary. - /// </summary> - /// <returns>Dictionary.</returns> - IDictionary<TK, TV> ReadGenericDictionary<TK, TV>(); - - /// <summary> - /// Read generic dictionary. - /// </summary> - /// <param name="factory">Factory.</param> - /// <returns>Dictionary.</returns> - IDictionary<TK, TV> ReadGenericDictionary<TK, TV>(PortableGenericDictionaryFactory<TK, TV> factory); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/f65a53e4/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs index cc14f45..71b0c07 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs @@ -19,7 +19,6 @@ namespace Apache.Ignite.Core.Portable { using System; using System.Collections; - using System.Collections.Generic; /// <summary> /// Raw writer for portable objects. @@ -192,30 +191,30 @@ namespace Apache.Ignite.Core.Portable /// Write object array. /// </summary> /// <param name="val">Object array.</param> - void WriteObjectArray<T>(T[] val); + void WriteArray<T>(T[] val); /// <summary> - /// Write collection. + /// Writes a collection in interoperable form. + /// + /// Use this method to communicate with other platforms + /// or with nodes that need to read collection elements in portable form. + /// + /// When there is no need for portables or interoperability, please use <see cref="WriteObject{T}" />, + /// which will properly preserve generic collection type. /// </summary> /// <param name="val">Collection.</param> void WriteCollection(ICollection val); /// <summary> - /// Write generic collection. - /// </summary> - /// <param name="val">Collection.</param> - void WriteGenericCollection<T>(ICollection<T> val); - - /// <summary> - /// Write dictionary. + /// Writes a dictionary in interoperable form. + /// + /// Use this method to communicate with other platforms + /// or with nodes that need to read dictionary elements in portable form. + /// + /// When there is no need for portables or interoperability, please use <see cref="WriteObject{T}" />, + /// which will properly preserve generic dictionary type. /// </summary> /// <param name="val">Dictionary.</param> void WriteDictionary(IDictionary val); - - /// <summary> - /// Write generic dictionary. - /// </summary> - /// <param name="val">Dictionary.</param> - void WriteGenericDictionary<TK, TV>(IDictionary<TK, TV> val); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/f65a53e4/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs index ed86b7e..03702d3 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs @@ -19,7 +19,6 @@ namespace Apache.Ignite.Core.Portable { using System; using System.Collections; - using System.Collections.Generic; /// <summary> /// Delegate for collection creation. @@ -36,13 +35,6 @@ namespace Apache.Ignite.Core.Portable public delegate void PortableCollectionAdder(ICollection col, object elem); /// <summary> - /// Delegate for generic collection creation. - /// </summary> - /// <param name="size">Collection size.</param> - /// <returns>Collection.</returns> - public delegate ICollection<T> PortableGenericCollectionFactory<T>(int size); - - /// <summary> /// Delegate for dictionary creation. /// </summary> /// <param name="size">Dictionary size.</param> @@ -50,13 +42,6 @@ namespace Apache.Ignite.Core.Portable public delegate IDictionary PortableDictionaryFactory(int size); /// <summary> - /// Delegate for generic collection creation. - /// </summary> - /// <param name="size">Collection size.</param> - /// <returns>Collection.</returns> - public delegate IDictionary<TK, TV> PortableGenericDictionaryFactory<TK, TV>(int size); - - /// <summary> /// Reader for portable objects. /// </summary> public interface IPortableReader @@ -268,7 +253,7 @@ namespace Apache.Ignite.Core.Portable /// </summary> /// <param name="fieldName">Field name.</param> /// <returns>Object array.</returns> - T[] ReadObjectArray<T>(string fieldName); + T[] ReadArray<T>(string fieldName); /// <summary> /// Read named collection. @@ -287,21 +272,6 @@ namespace Apache.Ignite.Core.Portable ICollection ReadCollection(string fieldName, PortableCollectionFactory factory, PortableCollectionAdder adder); /// <summary> - /// Read named generic collection. - /// </summary> - /// <param name="fieldName">Field name.</param> - /// <returns>Collection.</returns> - ICollection<T> ReadGenericCollection<T>(string fieldName); - - /// <summary> - /// Read named generic collection. - /// </summary> - /// <param name="fieldName">Field name.</param> - /// <param name="factory">Factory.</param> - /// <returns>Collection.</returns> - ICollection<T> ReadGenericCollection<T>(string fieldName, PortableGenericCollectionFactory<T> factory); - - /// <summary> /// Read named dictionary. /// </summary> /// <param name="fieldName">Field name.</param> @@ -317,21 +287,6 @@ namespace Apache.Ignite.Core.Portable IDictionary ReadDictionary(string fieldName, PortableDictionaryFactory factory); /// <summary> - /// Read named generic dictionary. - /// </summary> - /// <param name="fieldName">Field name.</param> - /// <returns>Dictionary.</returns> - IDictionary<TK, TV> ReadGenericDictionary<TK, TV>(string fieldName); - - /// <summary> - /// Read named generic dictionary. - /// </summary> - /// <param name="fieldName">Field name.</param> - /// <param name="factory">Factory.</param> - /// <returns>Dictionary.</returns> - IDictionary<TK, TV> ReadGenericDictionary<TK, TV>(string fieldName, PortableGenericDictionaryFactory<TK, TV> factory); - - /// <summary> /// Get raw reader. /// </summary> /// <returns>Raw reader.</returns> http://git-wip-us.apache.org/repos/asf/ignite/blob/f65a53e4/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs index 670a137..6e5d680 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs @@ -19,7 +19,6 @@ namespace Apache.Ignite.Core.Portable { using System; using System.Collections; - using System.Collections.Generic; /// <summary> /// Writer for portable objects. @@ -220,37 +219,35 @@ namespace Apache.Ignite.Core.Portable /// </summary> /// <param name="fieldName">Field name.</param> /// <param name="val">Object array.</param> - void WriteObjectArray<T>(string fieldName, T[] val); + void WriteArray<T>(string fieldName, T[] val); /// <summary> - /// Write named collection. + /// Writes a named collection in interoperable form. + /// + /// Use this method to communicate with other platforms + /// or with nodes that need to read collection elements in portable form. + /// + /// When there is no need for portables or interoperability, please use <see cref="WriteObject{T}" />, + /// which will properly preserve generic collection type. /// </summary> /// <param name="fieldName">Field name.</param> /// <param name="val">Collection.</param> void WriteCollection(string fieldName, ICollection val); /// <summary> - /// Write named generic collection. - /// </summary> - /// <param name="fieldName">Field name.</param> - /// <param name="val">Collection.</param> - void WriteGenericCollection<T>(string fieldName, ICollection<T> val); - - /// <summary> - /// Write named dictionary. + /// Writes a named dictionary in interoperable form. + /// + /// Use this method to communicate with other platforms + /// or with nodes that need to read dictionary elements in portable form. + /// + /// When there is no need for portables or interoperability, please use <see cref="WriteObject{T}" />, + /// which will properly preserve generic dictionary type. /// </summary> /// <param name="fieldName">Field name.</param> /// <param name="val">Dictionary.</param> void WriteDictionary(string fieldName, IDictionary val); /// <summary> - /// Write named generic dictionary. - /// </summary> - /// <param name="fieldName">Field name.</param> - /// <param name="val">Dictionary.</param> - void WriteGenericDictionary<TK, TV>(string fieldName, IDictionary<TK, TV> val); - - /// <summary> /// Get raw writer. /// </summary> /// <returns>Raw writer.</returns>
