You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2015/09/21 16:27:24 UTC

[28/52] [partial] ignite git commit: IGNITE-1513: Moved .Net.

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableObject.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableObject.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableObject.cs
new file mode 100644
index 0000000..3da8dec
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableObject.cs
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    /// <summary>
+    /// Wrapper for serialized portable objects.
+    /// </summary>
+    public interface IPortableObject
+    {
+        /// <summary>
+        /// Gets portable object type ID.
+        /// </summary>
+        /// <value>
+        /// Type ID.
+        /// </value>
+        int TypeId { get; }
+
+        /// <summary>
+        /// Gets object metadata.
+        /// </summary>
+        /// <returns>Metadata.</returns>
+        IPortableMetadata GetMetadata();
+
+        /// <summary>
+        /// Gets field value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>
+        /// Field value.
+        /// </returns>
+        TF GetField<TF>(string fieldName);
+
+        /// <summary>
+        /// Gets fully deserialized instance of portable object.
+        /// </summary>
+        /// <returns>
+        /// Fully deserialized instance of portable object.
+        /// </returns>
+        T Deserialize<T>();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs
new file mode 100644
index 0000000..ee2520d
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableRawReader.cs
@@ -0,0 +1,264 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    using System;
+    using System.Collections;
+    using System.Collections.Generic;
+
+    /// <summary>
+    /// Raw reader for portable objects. 
+    /// </summary>
+    public interface IPortableRawReader
+    {
+        /// <summary>
+        /// Read byte value. 
+        /// </summary>
+        /// <returns>Byte value.</returns>
+        byte ReadByte();
+
+        /// <summary>
+        /// Read byte array. 
+        /// </summary>
+        /// <returns>Byte array.</returns>
+        byte[] ReadByteArray();
+
+        /// <summary>
+        /// Read char value. 
+        /// </summary>
+        /// <returns>Char value.</returns>
+        char ReadChar();
+
+        /// <summary>
+        /// Read char array. 
+        /// </summary>
+        /// <returns>Char array.</returns>
+        char[] ReadCharArray();
+
+        /// <summary>
+        /// Read short value. 
+        /// </summary>
+        /// <returns>Short value.</returns>
+        short ReadShort();
+
+        /// <summary>
+        /// Read short array. 
+        /// </summary>
+        /// <returns>Short array.</returns>
+        short[] ReadShortArray();
+
+        /// <summary>
+        /// Read int value. 
+        /// </summary>
+        /// <returns>Int value.</returns>
+        int ReadInt();
+
+        /// <summary>
+        /// Read int array. 
+        /// </summary>
+        /// <returns>Int array.</returns>
+        int[] ReadIntArray();
+
+        /// <summary>
+        /// Read long value. 
+        /// </summary>
+        /// <returns>Long value.</returns>
+        long ReadLong();
+
+        /// <summary>
+        /// Read long array. 
+        /// </summary>
+        /// <returns>Long array.</returns>
+        long[] ReadLongArray();
+
+        /// <summary>
+        /// Read boolean value. 
+        /// </summary>
+        /// <returns>Boolean value.</returns>
+        bool ReadBoolean();
+
+        /// <summary>
+        /// Read boolean array. 
+        /// </summary>
+        /// <returns>Boolean array.</returns>
+        bool[] ReadBooleanArray();
+
+        /// <summary>
+        /// Read float value. 
+        /// </summary>
+        /// <returns>Float value.</returns>
+        float ReadFloat();
+
+        /// <summary>
+        /// Read float array. 
+        /// </summary>
+        /// <returns>Float array.</returns>
+        float[] ReadFloatArray();
+
+        /// <summary>
+        /// Read double value. 
+        /// </summary>
+        /// <returns>Double value.</returns>
+        double ReadDouble();
+
+        /// <summary>
+        /// Read double array. 
+        /// </summary>
+        /// <returns>Double array.</returns>
+        double[] ReadDoubleArray();
+
+        /// <summary>
+        /// Read decimal value. 
+        /// </summary>
+        /// <returns>Decimal value.</returns>
+        decimal ReadDecimal();
+
+        /// <summary>
+        /// Read decimal array. 
+        /// </summary>
+        /// <returns>Decimal array.</returns>
+        decimal[] ReadDecimalArray();
+
+        /// <summary>
+        /// Read date value in UTC form. Shortcut for <c>ReadDate(false)</c>.
+        /// </summary>
+        /// <returns>Date value.</returns>
+        DateTime? ReadDate();
+
+        /// <summary>
+        /// Read date value.
+        /// </summary>
+        /// <param name="local">Whether to read date in local (<c>true</c>) or UTC (<c>false</c>) form.</param>
+        /// <returns></returns>
+        DateTime? ReadDate(bool local);
+
+        /// <summary>
+        /// Read date array in UTC form. Shortcut for <c>ReadDateArray(false)</c>.
+        /// </summary>
+        /// <returns>Date array.</returns>
+        DateTime?[] ReadDateArray();
+
+        /// <summary>
+        /// Read date array.
+        /// </summary>
+        /// <param name="local">Whether to read date array in local (<c>true</c>) or UTC (<c>false</c>) form.</param>
+        /// <returns>Date array.</returns>
+        DateTime?[] ReadDateArray(bool local);
+
+        /// <summary>
+        /// Read string value. 
+        /// </summary>
+        /// <returns>String value.</returns>
+        string ReadString();
+
+        /// <summary>
+        /// Read string array. 
+        /// </summary>
+        /// <returns>String array.</returns>
+        string[] ReadStringArray();
+
+        /// <summary>
+        /// Read GUID value. 
+        /// </summary>
+        /// <returns>GUID value.</returns>
+        Guid? ReadGuid();
+
+        /// <summary>
+        /// Read GUID array. 
+        /// </summary>
+        /// <returns>GUID array.</returns>
+        Guid?[] ReadGuidArray();
+
+        /// <summary>
+        /// Read enum value.
+        /// </summary>
+        /// <returns>Enum value.</returns>
+        T ReadEnum<T>();
+
+        /// <summary>
+        /// Read enum array.
+        /// </summary>
+        /// <returns>Enum array.</returns>
+        T[] ReadEnumArray<T>();
+        
+        /// <summary>
+        /// Read object. 
+        /// </summary>
+        /// <returns>Object.</returns>
+        T ReadObject<T>();
+
+        /// <summary>
+        /// Read object array. 
+        /// </summary>
+        /// <returns>Object array.</returns>
+        T[] ReadObjectArray<T>();
+
+        /// <summary>
+        /// Read collection. 
+        /// </summary>
+        /// <returns>Collection.</returns>
+        ICollection ReadCollection();
+
+        /// <summary>
+        /// Read collection.
+        /// </summary>
+        /// <param name="factory">Factory.</param>
+        /// <param name="adder">Adder.</param>
+        /// <returns>Collection.</returns>
+        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>
+        IDictionary ReadDictionary();
+
+        /// <summary>
+        /// Read dictionary.
+        /// </summary>
+        /// <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/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs
new file mode 100644
index 0000000..eacfde3
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableRawWriter.cs
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    using System;
+    using System.Collections;
+    using System.Collections.Generic;
+
+    /// <summary>
+    /// Raw writer for portable objects. 
+    /// </summary>
+    public interface IPortableRawWriter
+    {
+        /// <summary>
+        /// Write byte value.
+        /// </summary>
+        /// <param name="val">Byte value.</param>
+        void WriteByte(byte val);
+
+        /// <summary>
+        /// Write byte array.
+        /// </summary>
+        /// <param name="val">Byte array.</param>
+        void WriteByteArray(byte[] val);
+
+        /// <summary>
+        /// Write char value.
+        /// </summary>
+        /// <param name="val">Char value.</param>
+        void WriteChar(char val);
+
+        /// <summary>
+        /// Write char array.
+        /// </summary>
+        /// <param name="val">Char array.</param>
+        void WriteCharArray(char[] val);
+
+        /// <summary>
+        /// Write short value.
+        /// </summary>
+        /// <param name="val">Short value.</param>
+        void WriteShort(short val);
+
+        /// <summary>
+        /// Write short array.
+        /// </summary>
+        /// <param name="val">Short array.</param>
+        void WriteShortArray(short[] val);
+
+        /// <summary>
+        /// Write int value.
+        /// </summary>
+        /// <param name="val">Int value.</param>
+        void WriteInt(int val);
+
+        /// <summary>
+        /// Write int array.
+        /// </summary>
+        /// <param name="val">Int array.</param>
+        void WriteIntArray(int[] val);
+
+        /// <summary>
+        /// Write long value.
+        /// </summary>
+        /// <param name="val">Long value.</param>
+        void WriteLong(long val);
+
+        /// <summary>
+        /// Write long array.
+        /// </summary>
+        /// <param name="val">Long array.</param>
+        void WriteLongArray(long[] val);
+
+        /// <summary>
+        /// Write boolean value.
+        /// </summary>
+        /// <param name="val">Boolean value.</param>
+        void WriteBoolean(bool val);
+
+        /// <summary>
+        /// Write boolean array.
+        /// </summary>
+        /// <param name="val">Boolean array.</param>
+        void WriteBooleanArray(bool[] val);
+
+        /// <summary>
+        /// Write float value.
+        /// </summary>
+        /// <param name="val">Float value.</param>
+        void WriteFloat(float val);
+
+        /// <summary>
+        /// Write float array.
+        /// </summary>
+        /// <param name="val">Float array.</param>
+        void WriteFloatArray(float[] val);
+
+        /// <summary>
+        /// Write double value.
+        /// </summary>
+        /// <param name="val">Double value.</param>
+        void WriteDouble(double val);
+
+        /// <summary>
+        /// Write double array.
+        /// </summary>
+        /// <param name="val">Double array.</param>
+        void WriteDoubleArray(double[] val);
+
+        /// <summary>
+        /// Write decimal value.
+        /// </summary>
+        /// <param name="val">Decimal value.</param>
+        void WriteDecimal(decimal val);
+
+        /// <summary>
+        /// Write decimal array.
+        /// </summary>
+        /// <param name="val">Decimal array.</param>
+        void WriteDecimalArray(decimal[] val);
+
+        /// <summary>
+        /// Write date value.
+        /// </summary>
+        /// <param name="val">Date value.</param>
+        void WriteDate(DateTime? val);
+
+        /// <summary>
+        /// Write date array.
+        /// </summary>
+        /// <param name="val">Date array.</param>
+        void WriteDateArray(DateTime?[] val);
+
+        /// <summary>
+        /// Write string value.
+        /// </summary>
+        /// <param name="val">String value.</param>
+        void WriteString(string val);
+
+        /// <summary>
+        /// Write string array.
+        /// </summary>
+        /// <param name="val">String array.</param>
+        void WriteStringArray(string[] val);
+
+        /// <summary>
+        /// Write GUID value.
+        /// </summary>
+        /// <param name="val">GUID value.</param>
+        void WriteGuid(Guid? val);
+
+        /// <summary>
+        /// Write GUID array.
+        /// </summary>
+        /// <param name="val">GUID array.</param>
+        void WriteGuidArray(Guid?[] val);
+
+        /// <summary>
+        /// Write enum value.
+        /// </summary>
+        /// <param name="val">Enum value.</param>
+        void WriteEnum<T>(T val);
+
+        /// <summary>
+        /// Write enum array.
+        /// </summary>
+        /// <param name="val">Enum array.</param>
+        void WriteEnumArray<T>(T[] val);
+
+        /// <summary>
+        /// Write object value.
+        /// </summary>
+        /// <param name="val">Object value.</param>
+        void WriteObject<T>(T val);
+
+        /// <summary>
+        /// Write object array.
+        /// </summary>
+        /// <param name="val">Object array.</param>
+        void WriteObjectArray<T>(T[] val);
+
+        /// <summary>
+        /// Write collection.
+        /// </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.
+        /// </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/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs
new file mode 100644
index 0000000..71bd4f2
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableReader.cs
@@ -0,0 +1,340 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    using System;
+    using System.Collections;
+    using System.Collections.Generic;
+
+    /// <summary>
+    /// Delegate for collection creation.
+    /// </summary>
+    /// <param name="size">Collection size.</param>
+    /// <returns>Collection.</returns>
+    public delegate ICollection PortableCollectionFactory(int size);
+
+    /// <summary>
+    /// Delegate for adding element to collection.
+    /// </summary>
+    /// <param name="col">Collection.</param>
+    /// <param name="elem">Element to add.</param>
+    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>
+    /// <returns>Dictionary.</returns>
+    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 
+    {
+        /// <summary>
+        /// Read named byte value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Byte value.</returns>
+        byte ReadByte(string fieldName);
+        
+        /// <summary>
+        /// Read named byte array. 
+        /// </summary>
+        /// <returns>Byte array.</returns>
+        byte[] ReadByteArray(string fieldName);
+        
+        /// <summary>
+        /// Read named char value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Char value.</returns>
+        char ReadChar(string fieldName);
+
+        /// <summary>
+        /// Read named char array. 
+        /// </summary>
+        /// <returns>Char array.</returns>
+        char[] ReadCharArray(string fieldName);
+
+        /// <summary>
+        /// Read named short value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Short value.</returns>
+        short ReadShort(string fieldName);
+
+        /// <summary>
+        /// Read named short array. 
+        /// </summary>
+        /// <returns>Short array.</returns>
+        short[] ReadShortArray(string fieldName);        
+
+        /// <summary>
+        /// Read named int value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Int value.</returns>
+        int ReadInt(string fieldName);
+
+        /// <summary>
+        /// Read named int array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Int array.</returns>
+        int[] ReadIntArray(string fieldName);
+
+        /// <summary>
+        /// Read named long value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Long value.</returns>
+        long ReadLong(string fieldName);
+
+        /// <summary>
+        /// Read named long array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Long array.</returns>
+        long[] ReadLongArray(string fieldName);
+
+        /// <summary>
+        /// Read named boolean value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Boolean value.</returns>
+        bool ReadBoolean(string fieldName);
+
+        /// <summary>
+        /// Read named boolean array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Boolean array.</returns>
+        bool[] ReadBooleanArray(string fieldName);
+
+        /// <summary>
+        /// Read named float value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Float value.</returns>
+        float ReadFloat(string fieldName);
+
+        /// <summary>
+        /// Read named float array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Float array.</returns>
+        float[] ReadFloatArray(string fieldName);
+
+        /// <summary>
+        /// Read named double value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Double value.</returns>
+        double ReadDouble(string fieldName);        
+
+        /// <summary>
+        /// Read named double array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Double array.</returns>
+        double[] ReadDoubleArray(string fieldName);
+
+        /// <summary>
+        /// Read named decimal value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Decimal value.</returns>
+        decimal ReadDecimal(string fieldName);
+
+        /// <summary>
+        /// Read named decimal array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Decimal array.</returns>
+        decimal[] ReadDecimalArray(string fieldName);
+
+        /// <summary>
+        /// Read named date value in UTC form. Shortcut for <c>ReadDate(fieldName, false)</c>.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Date value.</returns>
+        DateTime? ReadDate(string fieldName);
+
+        /// <summary>
+        /// Read named date value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="local">Whether to read date in local (<c>true</c>) or UTC (<c>false</c>) form.</param>
+        /// <returns>Date vaule.</returns>
+        DateTime? ReadDate(string fieldName, bool local);
+
+        /// <summary>
+        /// Read named date array in UTC form. Shortcut for <c>ReadDateArray(fieldName, false)</c>.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Date array.</returns>
+        DateTime?[] ReadDateArray(string fieldName);
+
+        /// <summary>
+        /// Read named date array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="local">Whether to read date in local (<c>true</c>) or UTC (<c>false</c>) form.</param>
+        /// <returns>Date array.</returns>
+        DateTime?[] ReadDateArray(string fieldName, bool local);
+
+        /// <summary>
+        /// Read named string value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>String value.</returns>
+        string ReadString(string fieldName);
+
+        /// <summary>
+        /// Read named string array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>String array.</returns>
+        string[] ReadStringArray(string fieldName);
+
+        /// <summary>
+        /// Read named GUID value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>GUID value.</returns>
+        Guid? ReadGuid(string fieldName);
+
+        /// <summary>
+        /// Read named GUID array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>GUID array.</returns>
+        Guid?[] ReadGuidArray(string fieldName);
+        
+        /// <summary>
+        /// Read named enum value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Enum value.</returns>
+        T ReadEnum<T>(string fieldName);
+
+        /// <summary>
+        /// Read named enum array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Enum array.</returns>
+        T[] ReadEnumArray<T>(string fieldName);
+
+        /// <summary>
+        /// Read named object.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Object.</returns>
+        T ReadObject<T>(string fieldName);
+
+        /// <summary>
+        /// Read named object array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Object array.</returns>
+        T[] ReadObjectArray<T>(string fieldName);
+
+        /// <summary>
+        /// Read named collection.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <returns>Collection.</returns>
+        ICollection ReadCollection(string fieldName);
+
+        /// <summary>
+        /// Read named collection.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="factory">Factory.</param>
+        /// <param name="adder">Adder.</param>
+        /// <returns>Collection.</returns>
+        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>
+        /// <returns>Dictionary.</returns>
+        IDictionary ReadDictionary(string fieldName);
+
+        /// <summary>
+        /// Read named dictionary.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="factory">Factory.</param>
+        /// <returns>Dictionary.</returns>
+        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>
+        IPortableRawReader RawReader();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableSerializer.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableSerializer.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableSerializer.cs
new file mode 100644
index 0000000..ac40dd7
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableSerializer.cs
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    /// <summary>
+    /// Portable serializer. 
+    /// </summary> 
+    public interface IPortableSerializer
+    {
+        /// <summary>
+        /// Write portalbe object.
+        /// </summary>
+        /// <param name="obj">Object.</param>
+        /// <param name="writer">Poratble writer.</param>
+        void WritePortable(object obj, IPortableWriter writer);
+
+        /// <summary>
+        /// Read portable object.
+        /// </summary>
+        /// <param name="obj">Instantiated empty object.</param>
+        /// <param name="reader">Poratble reader.</param>
+        void ReadPortable(object obj, IPortableReader reader);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs
new file mode 100644
index 0000000..8df2d50
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortableWriter.cs
@@ -0,0 +1,259 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable 
+{
+    using System;
+    using System.Collections;
+    using System.Collections.Generic;
+
+    /// <summary>
+    /// Writer for portable objects. 
+    /// </summary>
+    public interface IPortableWriter 
+    {
+        /// <summary>
+        /// Write named byte value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Byte value.</param>
+        void WriteByte(string fieldName, byte val);
+
+        /// <summary>
+        /// Write named byte array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Byte array.</param>
+        void WriteByteArray(string fieldName, byte[] val);
+
+        /// <summary>
+        /// Write named char value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Char value.</param>
+        void WriteChar(string fieldName, char val);
+
+        /// <summary>
+        /// Write named char array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Char array.</param>
+        void WriteCharArray(string fieldName, char[] val);
+
+        /// <summary>
+        /// Write named short value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Short value.</param>
+        void WriteShort(string fieldName, short val);
+
+        /// <summary>
+        /// Write named short array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Short array.</param>
+        void WriteShortArray(string fieldName, short[] val);
+
+        /// <summary>
+        /// Write named int value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Int value.</param>
+        void WriteInt(string fieldName, int val);
+
+        /// <summary>
+        /// Write named int array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Int array.</param>
+        void WriteIntArray(string fieldName, int[] val);
+
+        /// <summary>
+        /// Write named long value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Long value.</param>
+        void WriteLong(string fieldName, long val);
+
+        /// <summary>
+        /// Write named long array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Long array.</param>
+        void WriteLongArray(string fieldName, long[] val);
+
+        /// <summary>
+        /// Write named boolean value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Boolean value.</param>
+        void WriteBoolean(string fieldName, bool val);
+
+        /// <summary>
+        /// Write named boolean array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Boolean array.</param>
+        void WriteBooleanArray(string fieldName, bool[] val);
+
+        /// <summary>
+        /// Write named float value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Float value.</param>
+        void WriteFloat(string fieldName, float val);
+
+        /// <summary>
+        /// Write named float array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Float array.</param>
+        void WriteFloatArray(string fieldName, float[] val);
+
+        /// <summary>
+        /// Write named double value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Double value.</param>
+        void WriteDouble(string fieldName, double val);
+
+        /// <summary>
+        /// Write named double array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Double array.</param>
+        void WriteDoubleArray(string fieldName, double[] val);
+
+        /// <summary>
+        /// Write named decimal value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Decimal value.</param>
+        void WriteDecimal(string fieldName, decimal val);
+
+        /// <summary>
+        /// Write named decimal array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Decimal array.</param>
+        void WriteDecimalArray(string fieldName, decimal[] val);
+
+        /// <summary>
+        /// Write named date value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Date value.</param>
+        void WriteDate(string fieldName, DateTime? val);
+
+        /// <summary>
+        /// Write named date array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Date array.</param>
+        void WriteDateArray(string fieldName, DateTime?[] val);
+
+        /// <summary>
+        /// Write named string value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">String value.</param>
+        void WriteString(string fieldName, string val);
+
+        /// <summary>
+        /// Write named string array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">String array.</param>
+        void WriteStringArray(string fieldName, string[] val);
+
+        /// <summary>
+        /// Write named GUID value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">GUID value.</param>
+        void WriteGuid(string fieldName, Guid? val);
+
+        /// <summary>
+        /// Write named GUID array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">GUID array.</param>
+        void WriteGuidArray(string fieldName, Guid?[] val);
+
+        /// <summary>
+        /// Write named enum value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Enum value.</param>
+        void WriteEnum<T>(string fieldName, T val);
+
+        /// <summary>
+        /// Write named enum array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Enum array.</param>
+        void WriteEnumArray<T>(string fieldName, T[] val);
+
+        /// <summary>
+        /// Write named object value.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Object value.</param>
+        void WriteObject<T>(string fieldName, T val);
+
+        /// <summary>
+        /// Write named object array.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="val">Object array.</param>
+        void WriteObjectArray<T>(string fieldName, T[] val);
+
+        /// <summary>
+        /// Write named collection.
+        /// </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.
+        /// </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>
+        IPortableRawWriter RawWriter();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortables.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortables.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortables.cs
new file mode 100644
index 0000000..b1e77a6
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/IPortables.cs
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    using System;
+    using System.Collections.Generic;
+
+    /// <summary>
+    /// Defines portable objects functionality. With portable objects you are able to:
+    /// <list type="bullet">
+    ///     <item>
+    ///         <description>Seamlessly interoperate between Java, .NET, and C++.</description>
+    ///     </item>
+    ///     <item>
+    ///         <description>Make any object portable with zero code change to your existing code.</description>
+    ///     </item>
+    ///     <item>
+    ///         <description>Nest portable objects within each other.</description>
+    ///     </item>
+    ///     <item>
+    ///         <description>Automatically handle <c>circular</c> or <c>null</c> references.</description>
+    ///     </item>
+    ///     <item>
+    ///         <description>Automatically convert collections and maps between Java, .NET, and C++.</description>
+    ///     </item>
+    ///     <item>
+    ///         <description>Optionally avoid deserialization of objects on the server side.</description>
+    ///     </item>
+    ///     <item>
+    ///         <description>Avoid need to have concrete class definitions on the server side.</description>
+    ///     </item>
+    ///     <item>
+    ///         <description>Dynamically change structure of the classes without having to restart the cluster.</description>
+    ///     </item>
+    ///     <item>
+    ///         <description>Index into portable objects for querying purposes.</description>
+    ///     </item>
+    /// </list>
+    /// </summary>
+    public interface IPortables
+    {
+        /// <summary>
+        /// Converts provided object to portable form.
+        /// <para />
+        /// Note that object's type needs to be configured in <see cref="PortableConfiguration"/>.
+        /// </summary>
+        /// <param name="obj">Object to convert.</param>
+        /// <returns>Converted object.</returns>
+        T ToPortable<T>(object obj);
+
+        /// <summary>
+        /// Create builder for the given portable object type. Note that this
+        /// type must be specified in <see cref="PortableConfiguration"/>.
+        /// </summary>
+        /// <param name="type"></param>
+        /// <returns>Builder.</returns>
+        IPortableBuilder GetBuilder(Type type);
+
+        /// <summary>
+        /// Create builder for the given portable object type name. Note that this
+        /// type name must be specified in <see cref="PortableConfiguration"/>.
+        /// </summary>
+        /// <param name="typeName">Type name.</param>
+        /// <returns>Builder.</returns>
+        IPortableBuilder GetBuilder(string typeName);
+
+        /// <summary>
+        /// Create builder over existing portable object.
+        /// </summary>
+        /// <param name="obj"></param>
+        /// <returns>Builder.</returns>
+        IPortableBuilder GetBuilder(IPortableObject obj);
+
+        /// <summary>
+        /// Gets type id for the given type name.
+        /// </summary>
+        /// <param name="typeName">Type name.</param>
+        /// <returns>Type id.</returns>
+        int GetTypeId(string typeName);
+
+        /// <summary>
+        /// Gets metadata for all known types.
+        /// </summary>
+        /// <returns>Metadata.</returns>
+        ICollection<IPortableMetadata> GetMetadata();
+
+        /// <summary>
+        /// Gets metadata for specified type id.
+        /// </summary>
+        /// <returns>Metadata.</returns>
+        IPortableMetadata GetMetadata(int typeId);
+
+        /// <summary>
+        /// Gets metadata for specified type name.
+        /// </summary>
+        /// <returns>Metadata.</returns>
+        IPortableMetadata GetMetadata(string typeName);
+
+        /// <summary>
+        /// Gets metadata for specified type.
+        /// </summary>
+        /// <returns>Metadata.</returns>
+        IPortableMetadata GetMetadata(Type type);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableConfiguration.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableConfiguration.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableConfiguration.cs
new file mode 100644
index 0000000..39878c2
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableConfiguration.cs
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    using System.Collections.Generic;
+
+    /// <summary>
+    /// Portable type configuration.
+    /// </summary>
+    public class PortableConfiguration
+    {
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        public PortableConfiguration()
+        {
+            DefaultMetadataEnabled = true;
+            DefaultKeepDeserialized = true;
+        }
+
+        /// <summary>
+        /// Copying constructor.
+        /// </summary>
+        /// <param name="cfg">Configuration to copy.</param>
+        public PortableConfiguration(PortableConfiguration cfg)
+        {
+            DefaultIdMapper = cfg.DefaultIdMapper;
+            DefaultNameMapper = cfg.DefaultNameMapper;
+            DefaultMetadataEnabled = cfg.DefaultMetadataEnabled;
+            DefaultKeepDeserialized = cfg.DefaultKeepDeserialized;
+            DefaultSerializer = cfg.DefaultSerializer;
+
+            Types = cfg.Types != null ? new List<string>(cfg.Types) : null;
+
+            if (cfg.TypeConfigurations != null)
+            {
+                TypeConfigurations = new List<PortableTypeConfiguration>(cfg.TypeConfigurations.Count);
+
+                foreach (PortableTypeConfiguration typeCfg in cfg.TypeConfigurations) 
+                    TypeConfigurations.Add(new PortableTypeConfiguration(typeCfg));
+            }
+        }
+
+        /// <summary>
+        /// Type configurations.
+        /// </summary>
+        public ICollection<PortableTypeConfiguration> TypeConfigurations
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Portable types. Shorthand for creating PortableTypeConfiguration.
+        /// </summary>
+        public ICollection<string> Types
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Default name mapper.
+        /// </summary>
+        public IPortableNameMapper DefaultNameMapper
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Default ID mapper.
+        /// </summary>
+        public IPortableIdMapper DefaultIdMapper
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Default serializer.
+        /// </summary>
+        public IPortableSerializer DefaultSerializer
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Default metadata enabled flag. Defaults to true.
+        /// </summary>
+        public bool DefaultMetadataEnabled
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Default keep deserialized flag.
+        /// </summary>
+        public bool DefaultKeepDeserialized
+        {
+            get;
+            set;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableException.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableException.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableException.cs
new file mode 100644
index 0000000..95edbc0
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableException.cs
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable 
+{
+    using System;
+    using System.Runtime.Serialization;
+    using Apache.Ignite.Core.Common;
+
+    /// <summary>
+    /// Indicates an error during portable marshalling.
+    /// </summary>
+    [Serializable]
+    public class PortableException : IgniteException
+    {
+        /// <summary>
+        /// Constructs an exception. 
+        /// </summary>
+        public PortableException() 
+        {
+            // No-op.
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="PortableException"/> class.
+        /// </summary>
+        /// <param name="message">The message that describes the error.</param>
+        public PortableException(string message)
+            : base(message) {
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="PortableException"/> class.
+        /// </summary>
+        /// <param name="message">The message.</param>
+        /// <param name="cause">The cause.</param>
+        public PortableException(string message, Exception cause)
+            : base(message, cause) {
+        }
+
+        /// <summary>
+        /// Constructs an exception.
+        /// </summary>
+        /// <param name="info">Serialization info.</param>
+        /// <param name="ctx">Streaming context.</param>
+        protected PortableException(SerializationInfo info, StreamingContext ctx)
+            : base(info, ctx) {
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableTypeConfiguration.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableTypeConfiguration.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableTypeConfiguration.cs
new file mode 100644
index 0000000..bbbd4a8
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableTypeConfiguration.cs
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    using System;
+
+    /// <summary>
+    /// Portable type configuration.
+    /// </summary>
+    public class PortableTypeConfiguration
+    {
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        public PortableTypeConfiguration()
+        {
+            // No-op.
+        }
+
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        /// <param name="typeName">Type name.</param>
+        public PortableTypeConfiguration(string typeName)
+        {
+            TypeName = typeName;
+        }
+
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        /// <param name="type">Type.</param> 
+        public PortableTypeConfiguration(Type type)
+        {
+            TypeName = type.FullName;
+        }
+
+        /// <summary>
+        /// Copying constructor.
+        /// </summary>
+        /// <param name="cfg">Configuration to copy.</param>
+        public PortableTypeConfiguration(PortableTypeConfiguration cfg)
+        {
+            AffinityKeyFieldName = cfg.AffinityKeyFieldName;
+            AssemblyName = cfg.AssemblyName;
+            IdMapper = cfg.IdMapper;
+            NameMapper = cfg.NameMapper;
+            Serializer = cfg.Serializer;
+            TypeName = cfg.TypeName;
+            MetadataEnabled = cfg.MetadataEnabled;
+            KeepDeserialized = cfg.KeepDeserialized;
+        }
+
+        /// <summary>
+        /// Assembly name. 
+        /// </summary>
+        public string AssemblyName
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Fully qualified type name. 
+        /// </summary>
+        public string TypeName
+        {
+            get;
+            set;
+        }
+        
+        /// <summary>
+        /// Name mapper for the given type. 
+        /// </summary>
+        public IPortableNameMapper NameMapper
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// ID mapper for the given type. When it is necessary to resolve class (field) ID, then 
+        /// this property will be checked first. If not set, then PortableClassIdAttribute 
+        /// (PortableFieldIdAttribute) will be checked in class through reflection. If required
+        /// attribute is not set, then ID will be hash code of the class (field) simple name in lower case. 
+        /// </summary>
+        public IPortableIdMapper IdMapper
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Serializer for the given type. If not provided and class implements IPortable
+        /// then its custom logic will be used. If not provided and class doesn't implement IPortable
+        /// then all fields of the class except of those with [NotSerialized] attribute will be serialized
+        ///with help of reflection.
+        /// </summary>
+        public IPortableSerializer Serializer
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Affinity key field name.
+        /// </summary>
+        public string AffinityKeyFieldName
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Metadata enabled flag. If set to non-null value, overrides default value set in 
+        /// PortableConfiguration.
+        /// </summary>
+        public bool? MetadataEnabled
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Keep deserialized flag. If set to non-null value, overrides default value set in 
+        /// PortableConfiguration.
+        /// </summary>
+        public bool? KeepDeserialized
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Returns a string that represents the current object.
+        /// </summary>
+        /// <returns>
+        /// A string that represents the current object.
+        /// </returns>
+        override public string ToString()
+        {
+            return typeof(PortableTypeConfiguration).Name + " [TypeName=" + TypeName + 
+                ", NameMapper=" +  NameMapper + ", IdMapper=" + IdMapper + ", Serializer=" + Serializer +
+                ", AffinityKeyFieldName=" + AffinityKeyFieldName + ']';
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableTypeNames.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableTypeNames.cs b/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableTypeNames.cs
new file mode 100644
index 0000000..ed792c3
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Portable/PortableTypeNames.cs
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Portable
+{
+    /// <summary>
+    /// Portable type name constants.
+    /// </summary>
+    public static class PortableTypeNames
+    {
+        /** Type name: boolean. */
+        public const string TypeNameBool = "boolean";
+
+        /** Type name: byte. */
+        public const string TypeNameByte = "byte";
+
+        /** Type name: short. */
+        public const string TypeNameShort = "short";
+
+        /** Type name: char. */
+        public const string TypeNameChar = "char";
+
+        /** Type name: int. */
+        public const string TypeNameInt = "int";
+
+        /** Type name: long. */
+        public const string TypeNameLong = "long";
+
+        /** Type name: float. */
+        public const string TypeNameFloat = "float";
+
+        /** Type name: double. */
+        public const string TypeNameDouble = "double";
+
+        /** Type name: decimal. */
+        public const string TypeNameDecimal = "decimal";
+
+        /** Type name: String. */
+        public const string TypeNameString = "String";
+
+        /** Type name: UUID. */
+        public const string TypeNameGuid = "UUID";
+
+        /** Type name: Date. */
+        public const string TypeNameDate = "Date";
+
+        /** Type name: Enum. */
+        public const string TypeNameEnum = "Enum";
+
+        /** Type name: Object. */
+        public const string TypeNameObject = "Object";
+
+        /** Type name: boolean array. */
+        public const string TypeNameArrayBool = "boolean[]";
+
+        /** Type name: byte array. */
+        public const string TypeNameArrayByte = "byte[]";
+
+        /** Type name: short array. */
+        public const string TypeNameArrayShort = "short[]";
+
+        /** Type name: char array. */
+        public const string TypeNameArrayChar = "char[]";
+
+        /** Type name: int array. */
+        public const string TypeNameArrayInt = "int[]";
+
+        /** Type name: long array. */
+        public const string TypeNameArrayLong = "long[]";
+
+        /** Type name: float array. */
+        public const string TypeNameArrayFloat = "float[]";
+
+        /** Type name: double array. */
+        public const string TypeNameArrayDouble = "double[]";
+
+        /** Type name: decimal array. */
+        public const string TypeNameArrayDecimal = "decimal[]";
+
+        /** Type name: String array. */
+        public const string TypeNameArrayString = "String[]";
+
+        /** Type name: UUID array. */
+        public const string TypeNameArrayGuid = "UUID[]";
+
+        /** Type name: Date array. */
+        public const string TypeNameArrayDate = "Date[]";
+
+        /** Type name: Enum array. */
+        public const string TypeNameArrayEnum = "Enum[]";
+
+        /** Type name: Object array. */
+        public const string TypeNameArrayObject = "Object[]";
+
+        /** Type name: Collection. */
+        public const string TypeNameCollection = "Collection";
+
+        /** Type name: Map. */
+        public const string TypeNameMap = "Map";
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs b/modules/platform/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..1bcb658
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle("Apache.Ignite.Core")]
+[assembly: AssemblyDescription("Apache Ignite .NET Core")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Apache Software Foundation")]
+[assembly: AssemblyProduct("Apache Ignite")]
+[assembly: AssemblyCopyright("Copyright ©  2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+[assembly: ComVisible(false)]
+
+[assembly: Guid("97db45a8-f922-456a-a819-7b3c6e5e03ba")]
+
+[assembly: AssemblyVersion("1.5.0")]
+[assembly: AssemblyFileVersion("1.5.0")]
+
+[assembly: CLSCompliant(true)]
+
+#if !EXCLUDE_INTERNALS_VISIBLE_TO
+
+[assembly: InternalsVisibleTo("Apache.Ignite")]
+[assembly: InternalsVisibleTo("Apache.Ignite.Core.Tests")]
+
+#endif
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Resource/InstanceResourceAttribute.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Resource/InstanceResourceAttribute.cs b/modules/platform/dotnet/Apache.Ignite.Core/Resource/InstanceResourceAttribute.cs
new file mode 100644
index 0000000..8b34c10
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Resource/InstanceResourceAttribute.cs
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Resource
+{
+    using System;
+    using Apache.Ignite.Core.Compute;
+    using Apache.Ignite.Core.Impl.Compute;
+
+    /// <summary>
+    /// Attribute which injects <see cref="IIgnite"/> instance. Can be defined inside
+    /// implementors of <see cref="IComputeTask{A,T,TR}"/> and <see cref="IComputeJob"/> interfaces.
+    /// Can be applied to non-static fields, properties and methods returning <c>void</c> and 
+    /// accepting a single parameter.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property)]
+    public sealed class InstanceResourceAttribute : Attribute
+    {
+        // No-op.
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Resource/StoreSessionResourceAttribute.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Resource/StoreSessionResourceAttribute.cs b/modules/platform/dotnet/Apache.Ignite.Core/Resource/StoreSessionResourceAttribute.cs
new file mode 100644
index 0000000..624c71d
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Resource/StoreSessionResourceAttribute.cs
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Resource
+{
+    using System;
+    using Apache.Ignite.Core.Cache.Store;
+
+    /// <summary>
+    /// Annotates a field or a setter method for injection of current <see cref="ICacheStoreSession"/>
+    /// instance. It can be injected into <see cref="ICacheStore"/>.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property)]
+    public sealed class StoreSessionResourceAttribute : Attribute
+    {
+        // No-op.
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Services/IService.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Services/IService.cs b/modules/platform/dotnet/Apache.Ignite.Core/Services/IService.cs
new file mode 100644
index 0000000..3668221
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Services/IService.cs
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Services
+{
+    /// <summary>
+    /// Represents Ignite-managed service.
+    /// </summary>
+    public interface IService
+    {
+        /// <summary>
+        /// Initializes this instance before execution.
+        /// </summary>
+        /// <param name="context">Service execution context.</param>
+        void Init(IServiceContext context);
+
+        /// <summary>
+        /// Starts execution of this service. This method is automatically invoked whenever an instance of the service
+        /// is deployed on a Ignite node. Note that service is considered deployed even after it exits the Execute
+        /// method and can be cancelled (or undeployed) only by calling any of the Cancel methods on 
+        /// <see cref="IServices"/> API. Also note that service is not required to exit from Execute method until
+        /// Cancel method was called.
+        /// </summary>
+        /// <param name="context">Service execution context.</param>
+        void Execute(IServiceContext context);
+
+        /// <summary>
+        /// Cancels this instance.
+        /// <para/>
+        /// Note that Ignite cannot guarantee that the service exits from <see cref="IService.Execute"/>
+        /// method whenever <see cref="IService.Cancel"/> is called. It is up to the user to
+        /// make sure that the service code properly reacts to cancellations.
+        /// </summary>
+        /// <param name="context">Service execution context.</param>
+        void Cancel(IServiceContext context);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Services/IServiceContext.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Services/IServiceContext.cs b/modules/platform/dotnet/Apache.Ignite.Core/Services/IServiceContext.cs
new file mode 100644
index 0000000..50c3f14
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Services/IServiceContext.cs
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Services
+{
+    using System;
+
+    /// <summary>
+    /// Represents service execution context.
+    /// </summary>
+    public interface IServiceContext
+    {
+        /// <summary>
+        /// Gets service name.
+        /// </summary>
+        /// <returns>
+        /// Service name.
+        /// </returns>
+        string Name { get; }
+
+        /// <summary>
+        /// Gets service execution ID. Execution ID is guaranteed to be unique across all service deployments.
+        /// </summary>
+        /// <returns>
+        /// Service execution ID.
+        /// </returns>
+        Guid ExecutionId { get; }
+
+        /// <summary>
+        /// Get flag indicating whether service has been cancelled or not.
+        /// </summary>
+        /// <returns>
+        /// Flag indicating whether service has been cancelled or not.
+        /// </returns>
+        bool IsCancelled { get; }
+
+        /// <summary>
+        /// Gets cache name used for key-to-node affinity calculation. 
+        /// This parameter is optional and is set only when key-affinity service was deployed.
+        /// </summary>
+        /// <returns>
+        /// Cache name, possibly null.
+        /// </returns>
+        string CacheName { get; }
+
+        /// <summary>
+        /// Gets affinity key used for key-to-node affinity calculation. 
+        /// This parameter is optional and is set only when key-affinity service was deployed.
+        /// </summary>
+        /// <value>
+        /// Affinity key, possibly null.
+        /// </value>
+        object AffinityKey { get; }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f2eb16cd/modules/platform/dotnet/Apache.Ignite.Core/Services/IServiceDescriptor.cs
----------------------------------------------------------------------
diff --git a/modules/platform/dotnet/Apache.Ignite.Core/Services/IServiceDescriptor.cs b/modules/platform/dotnet/Apache.Ignite.Core/Services/IServiceDescriptor.cs
new file mode 100644
index 0000000..96bad4f
--- /dev/null
+++ b/modules/platform/dotnet/Apache.Ignite.Core/Services/IServiceDescriptor.cs
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Services
+{
+    using System;
+    using System.Collections.Generic;
+
+    /// <summary>
+    /// Service deployment descriptor.
+    /// </summary>
+    public interface IServiceDescriptor
+    {
+        /// <summary>
+        /// Gets service name.
+        /// </summary>
+        /// <returns>
+        /// Service name.
+        /// </returns>
+        string Name { get; }
+
+        /// <summary>
+        /// Gets the service type.
+        /// </summary>
+        /// <value>
+        /// Service type.
+        /// </value>
+        Type Type { get; }
+
+        /// <summary>
+        /// Gets maximum allowed total number of deployed services in the grid, 0 for unlimited.
+        /// </summary>
+        /// <returns>
+        /// Maximum allowed total number of deployed services in the grid, 0 for unlimited.
+        /// </returns>
+        int TotalCount { get; }
+
+        /// <summary>
+        /// Gets maximum allowed number of deployed services on each node, 0 for unlimited.
+        /// </summary>
+        /// <returns>
+        /// Maximum allowed total number of deployed services on each node, 0 for unlimited.
+        /// </returns>
+        int MaxPerNodeCount { get; }
+
+        /// <summary>
+        /// Gets cache name used for key-to-node affinity calculation. 
+        /// This parameter is optional and is set only when key-affinity service was deployed.
+        /// </summary>
+        /// <returns>
+        /// Cache name, possibly null.
+        /// </returns>
+        string CacheName { get; }
+
+        /// <summary>
+        /// Gets affinity key used for key-to-node affinity calculation. 
+        /// This parameter is optional and is set only when key-affinity service was deployed.
+        /// </summary>
+        /// <value>
+        /// Affinity key, possibly null.
+        /// </value>
+        object AffinityKey { get; }
+
+        /// <summary>
+        /// Gets affinity key used for key-to-node affinity calculation. 
+        /// This parameter is optional and is set only when key-affinity service was deployed.
+        /// </summary>
+        /// <returns>
+        /// Affinity key, possibly null.
+        /// </returns>
+        Guid OriginNodeId { get; }
+
+        /// <summary>
+        /// Gets service deployment topology snapshot. Service topology snapshot is represented
+        /// by number of service instances deployed on a node mapped to node ID.
+        /// </summary>
+        /// <value>
+        /// Map of number of service instances per node ID.
+        /// </value>
+        IDictionary<Guid, int> TopologySnapshot { get; }
+    }
+}
\ No newline at end of file