Search code examples
c#ignite

How to store DataTable in Apache Ignite?


Based on our current code implementation, we need to store System.Data.DataTable in cache. It works fine when using HttpRuntime.Cache, but not in Apache Ignite. The following is the code snippet.

IIgnite ignite = Ignition.Start();
ICache<string, object> cache = ignite.GetOrCreateCache<string, object>("cache");
DataTable table = new DataTable();
cache.Put("1", table);

It will throw "Unable to cast object of type 'Apache.Ignite.Core.Impl.Binary.BinaryWriter' to type 'System.IConvertible'" error.

Based on the info at https://apacheignite-net.readme.io/docs/serialization, DataTable implements ISerializable and has Serializable attribute. It should be able to serialize. I am not sure why I got this error. Any thoughts?

Environment: Ignite.NET 2.1, Visual Studio 2015


Solution

  • I've reproduced the issue, and I would say that this is a bug in System.Data.DataTable. Here is the code:

    public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
        SerializationFormat remotingFormat = RemotingFormat;
        bool isSingleTable = context.Context != null ? Convert.ToBoolean(context.Context, CultureInfo.InvariantCulture) : true;
        SerializeDataTable(info, context, isSingleTable, remotingFormat);
    }
    

    Exception comes from

    Convert.ToBoolean(context.Context, CultureInfo.InvariantCulture)
    

    The assumption that Context can be converted to bool does not look correct, see MSDN:

    additional: Any additional information to be associated with the StreamingContext.

    Ignite uses this to store BinaryWriter object for internal purposes.

    Anyway, .NET framework is not going to be fixed, so I've filed an Ignite.NET bug: https://issues.apache.org/jira/browse/IGNITE-5927