Suppressing reflective serialisation in Ignite

classic Classic list List threaded Threaded
11 messages Options
Raymond Wilson Raymond Wilson
Reply | Threaded
Open this post in threaded view
|

Suppressing reflective serialisation in Ignite

We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

dmagda dmagda
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

Raymond Wilson Raymond Wilson
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

ptupitsyn ptupitsyn
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

Hi Raymond,

Yes, you can do that by implementing IBinarySerializer like this:

class BinarizableSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
if (obj is IBinarizable bin)
{
bin.WriteBinary(writer);
}

throw new Exception("Not IBinarizable: " + obj.GetType());

}

public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
}

throw new Exception("Not IBinarizable: " + obj.GetType());
}
}
Then set it globally in IgniteConfiguration:
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
Serializer = new BinarizableSerializer()
}
};


On Thu, Nov 8, 2018 at 9:28 PM Raymond Wilson <[hidden email]> wrote:
Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

Raymond Wilson Raymond Wilson
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

Thanks Pavel - works well! :)

Raymond.

On Tue, Nov 13, 2018 at 9:20 AM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Yes, you can do that by implementing IBinarySerializer like this:

class BinarizableSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
if (obj is IBinarizable bin)
{
bin.WriteBinary(writer);
}

throw new Exception("Not IBinarizable: " + obj.GetType());

}

public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
}

throw new Exception("Not IBinarizable: " + obj.GetType());
}
}
Then set it globally in IgniteConfiguration:
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
Serializer = new BinarizableSerializer()
}
};


On Thu, Nov 8, 2018 at 9:28 PM Raymond Wilson <[hidden email]> wrote:
Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

Raymond Wilson Raymond Wilson
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

In reply to this post by ptupitsyn
Hi Pavel,

I have been using your suggestion with good effect. Thank you again for suggesting it.

I just ran into a case where an exception was thrown that stated System.AggregateException could not be serialised within this class.

While the BinarizableSerializer is good an ensuring all our serialization contexts are covered with IBinarySerializer, it seems obvious that things like Exception derivatives can not be. How would you modify this approach to make exceptions use the default reflective serialization?

Thanks,
Raymond.


On Tue, Nov 13, 2018 at 9:20 AM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Yes, you can do that by implementing IBinarySerializer like this:

class BinarizableSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
if (obj is IBinarizable bin)
{
bin.WriteBinary(writer);
}

throw new Exception("Not IBinarizable: " + obj.GetType());

}

public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
}

throw new Exception("Not IBinarizable: " + obj.GetType());
}
}
Then set it globally in IgniteConfiguration:
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
Serializer = new BinarizableSerializer()
}
};


On Thu, Nov 8, 2018 at 9:28 PM Raymond Wilson <[hidden email]> wrote:
Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

ptupitsyn ptupitsyn
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

Hi Raymond,

Exceptions implement ISerializable, and are serialized that way in Ignite. However, there is no "fallback" mechanism that you ask about (I should file a ticket, this is a good catch).

So the workaround is to use .NET BinaryFormatter to serialize non-IBInarizable types and write them as byte array (WriteByteArray / ReadByteArray).
Does this work for you?

Thanks,
Pavel

On Fri, Nov 23, 2018 at 2:05 AM Raymond Wilson <[hidden email]> wrote:
Hi Pavel,

I have been using your suggestion with good effect. Thank you again for suggesting it.

I just ran into a case where an exception was thrown that stated System.AggregateException could not be serialised within this class.

While the BinarizableSerializer is good an ensuring all our serialization contexts are covered with IBinarySerializer, it seems obvious that things like Exception derivatives can not be. How would you modify this approach to make exceptions use the default reflective serialization?

Thanks,
Raymond.


On Tue, Nov 13, 2018 at 9:20 AM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Yes, you can do that by implementing IBinarySerializer like this:

class BinarizableSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
if (obj is IBinarizable bin)
{
bin.WriteBinary(writer);
}

throw new Exception("Not IBinarizable: " + obj.GetType());

}

public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
}

throw new Exception("Not IBinarizable: " + obj.GetType());
}
}
Then set it globally in IgniteConfiguration:
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
Serializer = new BinarizableSerializer()
}
};


On Thu, Nov 8, 2018 at 9:28 PM Raymond Wilson <[hidden email]> wrote:
Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

ptupitsyn ptupitsyn
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

Sorry, I'm wrong.
You can of course just call writer.WriteObject(..) as a fallback, no need for BinaryFormatter.
Your only goal is to throw exception for *some* types, right?

On Fri, Nov 23, 2018 at 8:37 PM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Exceptions implement ISerializable, and are serialized that way in Ignite. However, there is no "fallback" mechanism that you ask about (I should file a ticket, this is a good catch).

So the workaround is to use .NET BinaryFormatter to serialize non-IBInarizable types and write them as byte array (WriteByteArray / ReadByteArray).
Does this work for you?

Thanks,
Pavel

On Fri, Nov 23, 2018 at 2:05 AM Raymond Wilson <[hidden email]> wrote:
Hi Pavel,

I have been using your suggestion with good effect. Thank you again for suggesting it.

I just ran into a case where an exception was thrown that stated System.AggregateException could not be serialised within this class.

While the BinarizableSerializer is good an ensuring all our serialization contexts are covered with IBinarySerializer, it seems obvious that things like Exception derivatives can not be. How would you modify this approach to make exceptions use the default reflective serialization?

Thanks,
Raymond.


On Tue, Nov 13, 2018 at 9:20 AM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Yes, you can do that by implementing IBinarySerializer like this:

class BinarizableSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
if (obj is IBinarizable bin)
{
bin.WriteBinary(writer);
}

throw new Exception("Not IBinarizable: " + obj.GetType());

}

public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
}

throw new Exception("Not IBinarizable: " + obj.GetType());
}
}
Then set it globally in IgniteConfiguration:
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
Serializer = new BinarizableSerializer()
}
};


On Thu, Nov 8, 2018 at 9:28 PM Raymond Wilson <[hidden email]> wrote:
Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

Raymond Wilson Raymond Wilson
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

Yes, I want to throw exceptions essentially for all application types. Things like ephemeral exceptions I don't need serialization control over.

Writing the object seems simple enough as you have suggested.

However, reading it back is less simple due to the way IBinarySerializer calls ReadBinary in the context of the object. reader.ReadBinary() returns an instance which is at odds with the instance passed into IBinarySerializer.ReadBinary, so I'm not sure how to get reader.ReadObject to deserialize the state into the passed obj parameter.

Thanks,
Raymond.


On Sat, Nov 24, 2018 at 6:41 AM Pavel Tupitsyn <[hidden email]> wrote:
Sorry, I'm wrong.
You can of course just call writer.WriteObject(..) as a fallback, no need for BinaryFormatter.
Your only goal is to throw exception for *some* types, right?

On Fri, Nov 23, 2018 at 8:37 PM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Exceptions implement ISerializable, and are serialized that way in Ignite. However, there is no "fallback" mechanism that you ask about (I should file a ticket, this is a good catch).

So the workaround is to use .NET BinaryFormatter to serialize non-IBInarizable types and write them as byte array (WriteByteArray / ReadByteArray).
Does this work for you?

Thanks,
Pavel

On Fri, Nov 23, 2018 at 2:05 AM Raymond Wilson <[hidden email]> wrote:
Hi Pavel,

I have been using your suggestion with good effect. Thank you again for suggesting it.

I just ran into a case where an exception was thrown that stated System.AggregateException could not be serialised within this class.

While the BinarizableSerializer is good an ensuring all our serialization contexts are covered with IBinarySerializer, it seems obvious that things like Exception derivatives can not be. How would you modify this approach to make exceptions use the default reflective serialization?

Thanks,
Raymond.


On Tue, Nov 13, 2018 at 9:20 AM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Yes, you can do that by implementing IBinarySerializer like this:

class BinarizableSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
if (obj is IBinarizable bin)
{
bin.WriteBinary(writer);
}

throw new Exception("Not IBinarizable: " + obj.GetType());

}

public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
}

throw new Exception("Not IBinarizable: " + obj.GetType());
}
}
Then set it globally in IgniteConfiguration:
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
Serializer = new BinarizableSerializer()
}
};


On Thu, Nov 8, 2018 at 9:28 PM Raymond Wilson <[hidden email]> wrote:
Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

ptupitsyn ptupitsyn
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

Yes, there is a mismatch there, Ignite passes uninitialized object to the serializer in order to handle reference loops.

I think the easiest workaround is to use some library like DeepClone [1]:
public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
return;
}

var res = reader.ReadObject<object>("x");
res.ShallowCloneTo(obj);
}


On Sat, Nov 24, 2018 at 11:56 AM Raymond Wilson <[hidden email]> wrote:
Yes, I want to throw exceptions essentially for all application types. Things like ephemeral exceptions I don't need serialization control over.

Writing the object seems simple enough as you have suggested.

However, reading it back is less simple due to the way IBinarySerializer calls ReadBinary in the context of the object. reader.ReadBinary() returns an instance which is at odds with the instance passed into IBinarySerializer.ReadBinary, so I'm not sure how to get reader.ReadObject to deserialize the state into the passed obj parameter.

Thanks,
Raymond.


On Sat, Nov 24, 2018 at 6:41 AM Pavel Tupitsyn <[hidden email]> wrote:
Sorry, I'm wrong.
You can of course just call writer.WriteObject(..) as a fallback, no need for BinaryFormatter.
Your only goal is to throw exception for *some* types, right?

On Fri, Nov 23, 2018 at 8:37 PM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Exceptions implement ISerializable, and are serialized that way in Ignite. However, there is no "fallback" mechanism that you ask about (I should file a ticket, this is a good catch).

So the workaround is to use .NET BinaryFormatter to serialize non-IBInarizable types and write them as byte array (WriteByteArray / ReadByteArray).
Does this work for you?

Thanks,
Pavel

On Fri, Nov 23, 2018 at 2:05 AM Raymond Wilson <[hidden email]> wrote:
Hi Pavel,

I have been using your suggestion with good effect. Thank you again for suggesting it.

I just ran into a case where an exception was thrown that stated System.AggregateException could not be serialised within this class.

While the BinarizableSerializer is good an ensuring all our serialization contexts are covered with IBinarySerializer, it seems obvious that things like Exception derivatives can not be. How would you modify this approach to make exceptions use the default reflective serialization?

Thanks,
Raymond.


On Tue, Nov 13, 2018 at 9:20 AM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Yes, you can do that by implementing IBinarySerializer like this:

class BinarizableSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
if (obj is IBinarizable bin)
{
bin.WriteBinary(writer);
}

throw new Exception("Not IBinarizable: " + obj.GetType());

}

public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
}

throw new Exception("Not IBinarizable: " + obj.GetType());
}
}
Then set it globally in IgniteConfiguration:
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
Serializer = new BinarizableSerializer()
}
};


On Thu, Nov 8, 2018 at 9:28 PM Raymond Wilson <[hidden email]> wrote:
Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.

ptupitsyn ptupitsyn
Reply | Threaded
Open this post in threaded view
|

Re: Suppressing reflective serialisation in Ignite

P.S. I realize that this is a major limitation.Ticket filed: https://issues.apache.org/jira/browse/IGNITE-10411 

On Mon, Nov 26, 2018 at 7:54 PM Pavel Tupitsyn <[hidden email]> wrote:
Yes, there is a mismatch there, Ignite passes uninitialized object to the serializer in order to handle reference loops.

I think the easiest workaround is to use some library like DeepClone [1]:
public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
return;
}

var res = reader.ReadObject<object>("x");
res.ShallowCloneTo(obj);
}


On Sat, Nov 24, 2018 at 11:56 AM Raymond Wilson <[hidden email]> wrote:
Yes, I want to throw exceptions essentially for all application types. Things like ephemeral exceptions I don't need serialization control over.

Writing the object seems simple enough as you have suggested.

However, reading it back is less simple due to the way IBinarySerializer calls ReadBinary in the context of the object. reader.ReadBinary() returns an instance which is at odds with the instance passed into IBinarySerializer.ReadBinary, so I'm not sure how to get reader.ReadObject to deserialize the state into the passed obj parameter.

Thanks,
Raymond.


On Sat, Nov 24, 2018 at 6:41 AM Pavel Tupitsyn <[hidden email]> wrote:
Sorry, I'm wrong.
You can of course just call writer.WriteObject(..) as a fallback, no need for BinaryFormatter.
Your only goal is to throw exception for *some* types, right?

On Fri, Nov 23, 2018 at 8:37 PM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Exceptions implement ISerializable, and are serialized that way in Ignite. However, there is no "fallback" mechanism that you ask about (I should file a ticket, this is a good catch).

So the workaround is to use .NET BinaryFormatter to serialize non-IBInarizable types and write them as byte array (WriteByteArray / ReadByteArray).
Does this work for you?

Thanks,
Pavel

On Fri, Nov 23, 2018 at 2:05 AM Raymond Wilson <[hidden email]> wrote:
Hi Pavel,

I have been using your suggestion with good effect. Thank you again for suggesting it.

I just ran into a case where an exception was thrown that stated System.AggregateException could not be serialised within this class.

While the BinarizableSerializer is good an ensuring all our serialization contexts are covered with IBinarySerializer, it seems obvious that things like Exception derivatives can not be. How would you modify this approach to make exceptions use the default reflective serialization?

Thanks,
Raymond.


On Tue, Nov 13, 2018 at 9:20 AM Pavel Tupitsyn <[hidden email]> wrote:
Hi Raymond,

Yes, you can do that by implementing IBinarySerializer like this:

class BinarizableSerializer : IBinarySerializer
{
public void WriteBinary(object obj, IBinaryWriter writer)
{
if (obj is IBinarizable bin)
{
bin.WriteBinary(writer);
}

throw new Exception("Not IBinarizable: " + obj.GetType());

}

public void ReadBinary(object obj, IBinaryReader reader)
{
if (obj is IBinarizable bin)
{
bin.ReadBinary(reader);
}

throw new Exception("Not IBinarizable: " + obj.GetType());
}
}
Then set it globally in IgniteConfiguration:
var cfg = new IgniteConfiguration
{
BinaryConfiguration = new BinaryConfiguration
{
Serializer = new BinarizableSerializer()
}
};


On Thu, Nov 8, 2018 at 9:28 PM Raymond Wilson <[hidden email]> wrote:
Hi Denis,

Yes, I understand reflective serialisation uses binarizable serialisation under the hood (and it's fast and easy to use). But it has issues in the face of schema changes so it is better (and recommended in the Ignite docs) to use Binarizable serialization for production.

I want to make sure all my serialization contexts are covered by explicit IBinarizable serialization. A simple approach would be to turn off reflective serialization to ensure cases where we have missed it fail explicitly. Is that possible?

Thanks,
Raymond.


On Thu, Nov 8, 2018 at 1:10 PM Denis Magda <[hidden email]> wrote:
Hi Raymond,

If to believe this page, the reflective serialization converts an object to the binary format (sort of marked with IBaniralizable interface implicitly):

--
Denis


On Tue, Nov 6, 2018 at 1:01 PM Raymond Wilson <[hidden email]> wrote:
We are currently converting our use of Ignite reflective serialisation to use IBinarizable based serialisation [using Ignite 2.6 with c# client]

What I would like to do is enforce a policy of not using reflective serialisation to ensure we have all the bases covered.

Is there a way to do this in Ignite?

Thanks,
Raymond.