This line is the problem:
public ICache<string, T> IgniteCache { get; set; }
You can't serialize an Ignite cache. Instead, use [InstanceResource] -
uncomment the line you already have, then get the cache by name:
[InstanceResource] private readonly IIgnite _ignite;
public string CacheName { get; set; }
...
var cache = _ignite.GetCache<string, T>(CacheName);
cache.Query(...)
On Wed, Aug 24, 2022 at 1:31 PM Charlin S <[email protected]> wrote:
> Hi,
> The exception details are as follows.
> System.AggregateException
> HResult=0x80131500
> Message=One or more errors occurred. (Serializing delegates is not
> supported on this platform.)
> Source=System.Private.CoreLib
> StackTrace:
> at System.Threading.Tasks.Task`1.GetResultCore(Boolean
> waitCompletionNotification)
> at System.Threading.Tasks.Task`1.get_Result()
> at Apache.Ignite.Core.Impl.Common.Future`1.Get()
> at
> Apache.Ignite.Core.Impl.Compute.Compute.Apply[TArg,TJobRes](IComputeFunc`2
> clo, TArg arg)
> at ConsoleApp2.CacheUtils.ComputeTest_OnIgnite(String searchCriteria)
> in D:\NGSourceCode\POC\ConsoleApp2\ConsoleApp2\CacheUtils.cs:line 76
> at ConsoleApp2.Program.Main(String[] args) in
> D:\NGSourceCode\POC\ConsoleApp2\ConsoleApp2\Program.cs:line 19
>
> This exception was originally thrown at this call stack:
>
> System.MulticastDelegate.GetObjectData(System.Runtime.Serialization.SerializationInfo,
> System.Runtime.Serialization.StreamingContext)
>
> Apache.Ignite.Core.Impl.Binary.SerializableSerializer.WriteBinary<T>(T,
> Apache.Ignite.Core.Impl.Binary.BinaryWriter)
> Apache.Ignite.Core.Impl.Binary.BinaryWriter.Write<T>(T)
> Apache.Ignite.Core.Impl.Binary.BinaryWriter.WriteObject<T>(string, T)
>
> Apache.Ignite.Core.Impl.Binary.BinaryReflectiveSerializerInternal.Apache.Ignite.Core.Impl.Binary.IBinarySerializerInternal.WriteBinary<T>(T,
> Apache.Ignite.Core.Impl.Binary.BinaryWriter)
> Apache.Ignite.Core.Impl.Binary.BinaryWriter.Write<T>(T)
> Apache.Ignite.Core.Impl.Binary.BinaryWriter.WriteObject<T>(string, T)
>
> Apache.Ignite.Core.Impl.Binary.BinaryReflectiveSerializerInternal.Apache.Ignite.Core.Impl.Binary.IBinarySerializerInternal.WriteBinary<T>(T,
> Apache.Ignite.Core.Impl.Binary.BinaryWriter)
> Apache.Ignite.Core.Impl.Binary.BinaryWriter.Write<T>(T)
> Apache.Ignite.Core.Impl.Binary.BinaryWriter.WriteObject<T>(string, T)
> ...
> [Call Stack Truncated]
>
> Inner Exception 1:
> SerializationException: Serializing delegates is not supported on this
> platform.
>
> Note: I am having two 2 server nodes and running the POC application on a
> client node.
>
> Regards,
> Charlin
>
>
>
> On Wed, 24 Aug 2022 at 15:02, Pavel Tupitsyn <[email protected]> wrote:
>
>> Please share the exception with full stack trace (you've only shared some
>> warnings, which may or may not be a problem).
>>
>> On Wed, Aug 24, 2022 at 10:26 AM Charlin S <[email protected]>
>> wrote:
>>
>>>
>>> I have a requirement to fetch the data using distributed-computing
>>> function and error at
>>> var res =
>>> CacheInstance.Instance.InstanceObject.GetCompute().Call(calls);
>>>
>>> // InstanceObject singleton object for Ignite
>>>
>>> [11:16:34,865][WARNING][main][Marshaller] Type
>>> 'System.Collections.Generic.Dictionary`2[System.Int64,Apache.Ignite.Core.Impl.Binary.BinaryFullTypeDescriptor]'
>>> implements 'System.Runtime.Serialization.ISerializable'. It will be written
>>> in Ignite binary format, however, the following limitations apply: DateTime
>>> fields would not work in SQL; sbyte, ushort, uint, ulong fields would not
>>> work in DML.
>>> [11:16:34,889][WARNING][main][Marshaller] Type
>>> 'System.Collections.Generic.Dictionary`2[System.String,System.Byte]'
>>> implements 'System.Runtime.Serialization.ISerializable'. It will be written
>>> in Ignite binary format, however, the following limitations apply: DateTime
>>> fields would not work in SQL; sbyte, ushort, uint, ulong fields would not
>>> work in DML.
>>> [11:16:34,895][WARNING][main][Marshaller] Type
>>> 'System.Func`2[Apache.Ignite.Core.Impl.Binary.BinaryReader,Apache.Ignite.Core.Impl.Compute.ComputeJobHolder]'
>>> implements 'System.Runtime.Serialization.ISerializable'. It will be written
>>> in Ignite binary format, however, the following limitations apply: DateTime
>>> fields would not work in SQL; sbyte, ushort, uint, ulong fields would not
>>> work in DML.
>>>
>>> Kindly help me on this and I have shared the implementation below.
>>>
>>> public class ComputeTestModel : IBinarizable
>>> {
>>>
>>> [QuerySqlField]
>>> public string TestField1 { get; set; }
>>> [QuerySqlField]
>>> public string TestField2 { get; set; }
>>> [QuerySqlField]
>>> public string TestField3 { get; set; }
>>>
>>>
>>> public void ReadBinary(IBinaryReader reader){}//not added
>>> implementation here
>>> public void WriteBinary(IBinaryWriter writer){}//not added
>>> implementation here
>>> }
>>>
>>>
>>> class TestModelComputeFunc<T> : IComputeFunc<List<ComputeTestModel>>
>>> {
>>> // [InstanceResource] private readonly IIgnite _ignite;
>>> public ICache<string, T> IgniteCache { get; set; }
>>>
>>> public string _searchCriteria { get; set; }
>>> public TestModelComputeFunc(ICache<string, T> igniteCache,
>>> string searchCriteria)
>>> {
>>> IgniteCache = igniteCache;
>>> _searchCriteria = searchCriteria;
>>> }
>>> public List<ComputeTestModel> Invoke()
>>> {
>>> List<ComputeTestModel> objs = new List<ComputeTestModel>();
>>> string query = "select * from ComputeTestModel where
>>> TestField1 = ?";
>>> SqlFieldsQuery fieldsQuery = new SqlFieldsQuery(query,
>>> _searchCriteria);
>>> IFieldsQueryCursor queryCursor =
>>> IgniteCache.Query(fieldsQuery);
>>> if (queryCursor != null)
>>> {
>>> foreach (var cacheEntry in queryCursor)
>>> {
>>> objs.Add(new ComputeTestModel
>>> {
>>> TestField1 = cacheEntry[0] as string,
>>> TestField2 = cacheEntry[1] as string,
>>> TestField3 = cacheEntry[2] as string
>>>
>>> });
>>> }
>>> return objs;
>>>
>>> }
>>> return null;
>>> }
>>> }
>>> }
>>>
>>> public static class CacheUtilsTest
>>> {
>>> public static List<ComputeTestModel> ComputeTest_OnIgnite(string
>>> searchCriteria)
>>> {
>>> //CacheInstance.Instance.ComputeTestICache defined in another class
>>> public ICache<string, ComputeTestModel> ComputeTestModelICache { get; set; }
>>>
>>> ComputeTestComputeFunc<ComputeTestModel> calls = new
>>> ComputeTestComputeFunc<ComputeTestModel>(CacheInstance.Instance.ComputeTestICache,
>>> searchCriteria);
>>>
>>> // Execute the collection of calls on the cluster.
>>> var res =
>>> CacheInstance.Instance.InstanceObject.GetCompute().Call(calls);
>>> //exception thrown here
>>>
>>>
>>> /*
>>> //another aproach
>>> ComputeTestComputeFunc<ComputeTestModel> cacheObject = new
>>> ComputeTestComputeFunc<ComputeTestModel>(CacheInstance.Instance.ComputeTestICache,
>>> searchCriteria);
>>> // var calls = CacheInstance.Instance.ComputeTestICache.Select(s =>
>>> cacheObject).ToList();
>>>
>>> // Execute the collection of calls on the cluster.
>>> var res =
>>> CacheInstance.Instance.InstanceObject.GetCompute().Call(calls);
>>> //exception thrown here
>>> */
>>> return null;
>>> }
>>>
>>> }
>>>
>>>
>>> class Program
>>> {
>>>
>>> static void Main(string[] args)
>>> {
>>> // Console.WriteLine("Hello World!");
>>> var saticCache = CacheInstance.Instance.InstanceObject;
>>>
>>> var res = CacheUtilsTest.ComputeTest_OnIgnite("A");
>>> int ans= res.Count();
>>> Console.ReadKey();
>>>
>>> }
>>> }
>>>
>>> Regards,
>>> Charlin
>>>
>>>
>>>