Ilya. Actually, current behaviour described even in documentation [1]
> Note that not all objects are converted to the binary object format. The > following classes are never converted (e.g., the toBinary(Object) method > returns the original object, and instances of these classes are stored > without changes): ... > ... arrays of objects (but the objects inside them are reconverted if they > are binary) [1] https://ignite.apache.org/docs/latest/key-value-api/binary-objects#enabling-binary-mode-for-caches > 19 мая 2021 г., в 14:12, Ilya Kasnacheev <ilya.kasnach...@gmail.com> > написал(а): > > Hello! > > Why do you need to take compatibility into account here at all? > You can start writing entries to cache in new format while reading both old > and new format. > > I consider returning Object[] instead of ConcreteType[] a bug so it's > totally OK to start returning the "better" ConcreteType[] instead. > > I think you can just fix the bug while preserving accessibility of old > (pre-bugfix) data as it was pre-2.11. > > Regards, > -- > Ilya Kasnacheev > > > ср, 19 мая 2021 г. в 14:08, Nikolay Izhikov <nizhi...@apache.org>: > >> Ilya, >> >>> Maybe we should just automate that, e.g., whenever user stores Type[], >> always store one-field ArrayWrapper object, and automatically unwrap it on >> get() >> >> Yes, I’m talking about this opportunity from the beginning of the thread. >> >>> 1. Implement binary serialization that correctly Ser and Deser array >> using some kind of the wrapper (BinaryArrayWrapper). >> >> >>> 19 мая 2021 г., в 14:05, Ilya Kasnacheev <ilya.kasnach...@gmail.com> >> написал(а): >>> >>> Hello! >>> >>> Yes, it does not look pretty, I agree. But I'm saying that I've not >>> encountered this issue on the user list before, and it can probably be >>> easily countered by storing some one-field ArrayWrapper object in the >> cache >>> as value. >>> >>> Maybe we should just automate that, e.g., whenever user stores Type[], >>> always store one-field ArrayWrapper object, and automatically unwrap it >> on >>> get() >>> This way we may not even need any changes to storage format, if binary >>> marshaller does not mind. >>> >>> Regards, >>> >>> Regards, >>> -- >>> Ilya Kasnacheev >>> >>> >>> ср, 19 мая 2021 г. в 13:33, Nikolay Izhikov <nizhi...@apache.org>: >>> >>>> Igniters. >>>> >>>> Just to clarify the issue: >>>> >>>> ``` >>>> public class BinaryObjectTest extends GridCommonAbstractTest { >>>> /** */ >>>> @Test >>>> public void testArray() throws Exception { >>>> Ignite ign = startGrid(); >>>> >>>> IgniteCache<Integer, TestClass1[]> cache = >>>> ign.createCache("my-cache"); >>>> >>>> cache.put(1, new TestClass1[] {new TestClass1(), new >>>> TestClass1()}); >>>> TestClass1[] obj = cache.get(1); //This will fail with >>>> ClassCastException. >>>> >>>> assertEquals(TestClass1[].class, obj.getClass()); >>>> } >>>> } >>>> ``` >>>> >>>>> 19 мая 2021 г., в 13:04, Nikolay Izhikov <nizhikov....@gmail.com> >>>> написал(а): >>>>> >>>>> Thanks, Ilya. >>>>> >>>>> Can you put more context on this? >>>>> I don’t familiar with these issues. >>>>> >>>>>> 19 мая 2021 г., в 13:02, Ilya Kasnacheev <ilya.kasnach...@gmail.com> >>>> написал(а): >>>>>> >>>>>> Hello! >>>>>> >>>>>> Obvious issues are Lazy SQL, Event Driven Services, Sort Binary Object >>>>>> Fields. >>>>>> >>>>>> Regards, >>>>>> -- >>>>>> Ilya Kasnacheev >>>>>> >>>>>> >>>>>> ср, 19 мая 2021 г. в 12:56, Nikolay Izhikov <nizhi...@apache.org>: >>>>>> >>>>>>> Hello, >>>>>>> >>>>>>>> However, for internal platform and services implementations we >> should >>>>>>> fix the root cause: >>>>>>>> avoid extra deserialization->serialization pass completely. >>>>>>>> This will also improve performance. >>>>>>> >>>>>>> Pavel, thanks for the feedback. >>>>>>> If I understand correctly, your suggestion is to know data size at >> the >>>>>>> start of reading service parameters. >>>>>>> Is it correct? >>>>>>> >>>>>>> Right now, when the service method invoked we pass an array of >>>> parameters >>>>>>> through platform reader/writer machinery. >>>>>>> On java side parameters read one by one and we don’t know the size of >>>> the >>>>>>> data on the read start. >>>>>>> >>>>>>> AFAICU, this will require x2 memory on the .Net or thin client-side. >>>>>>> >>>>>>> >>>>>>> >>>> >> https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java#L289 >>>>>>> >>>>>>> >>>>>>>> if we are to break compatibility, I would like to see it done for >> some >>>>>>> really common pain point. >>>>>>> >>>>>>> Ilya, can you, please, provide a list of common issues with Ignite >> that >>>>>>> can be resolved >>>>>>> only with compatibility breakage? >>>>>>> >>>>>>>> 4 мая 2021 г., в 12:58, Ilya Kasnacheev <ilya.kasnach...@gmail.com> >>>>>>> написал(а): >>>>>>>> >>>>>>>> Hello! >>>>>>>> >>>>>>>> If we really decide to break some compatibility then Array to >>>>>>> BinaryObject >>>>>>>> serialization will be very, very low on my personal list. >>>>>>>> >>>>>>>> I just don't see how this issue is relevant. I have been reading and >>>>>>>> answering user list for a few years now, and I don't remember a >> single >>>>>>>> question about storing ConcreteType[] as value and complaining about >>>> type >>>>>>>> information loss. >>>>>>>> >>>>>>>> If you have a good scenario how do we keep persistent store binary >>>>>>>> compatibility here, without adding a lot of new code and still >>>> checking >>>>>>> for >>>>>>>> both old and new approaches - you can go forward for sure. >>>>>>>> >>>>>>>> However, it does seem questionable where we have a new wrapper class >>>>>>>> specifically for top level arrays. You can have this wrapper in your >>>> own >>>>>>>> client code and it should work OK. >>>>>>>> >>>>>>>> Bottom line, if we are to break compatibility, I would like to see >> it >>>>>>> done >>>>>>>> for some really common pain point. >>>>>>>> >>>>>>>> Regards, >>>>>>>> -- >>>>>>>> Ilya Kasnacheev >>>>>>>> >>>>>>>> >>>>>>>> пт, 30 апр. 2021 г. в 17:34, Nikolay Izhikov <nizhi...@apache.org>: >>>>>>>> >>>>>>>>> Hello, Ilya. >>>>>>>>> >>>>>>>>> Thanks for the feedback! >>>>>>>>> >>>>>>>>>> For me it sounds like something we would like to do in 3.0 >>>>>>>>> >>>>>>>>> Ignite 3 is a very long way to go, so I prefer to target this fix >> in >>>>>>>>> Ignite 2.x. >>>>>>>>> >>>>>>>>>> I think making it default "true" is a breaking change and is not >>>>>>>>> possible in a minor release >>>>>>>>> >>>>>>>>> Yes, you are correct it is a breaking change. >>>>>>>>> It seems for me, we all agreed that breaking changes are possible >> in >>>>>>> minor >>>>>>>>> releases. >>>>>>>>> >>>>>>>>> Anyway, if we will decide do not to enable this feature by default >>>> it’s >>>>>>> OK >>>>>>>>> for me. >>>>>>>>> We still can implement it and improve the binary SerDe mechanism. >>>>>>>>> >>>>>>>>> >>>>>>>>>> 30 апр. 2021 г., в 17:23, Ilya Kasnacheev < >>>> ilya.kasnach...@gmail.com> >>>>>>>>> написал(а): >>>>>>>>>> >>>>>>>>>> Hello! >>>>>>>>>> >>>>>>>>>> For me it sounds like something we would like to do in 3.0 (if >>>> indeed >>>>>>> it >>>>>>>>>> will have arrays as possible value (or key) type), but doing it in >>>> 2.x >>>>>>>>>> raises concerns whether it has enough time left to stabilize. >>>>>>>>>> >>>>>>>>>> Also, I think making it default "true" is a breaking change and is >>>> not >>>>>>>>>> possible in a minor release, case in point, >>>>>>>>>> IGNITE_BINARY_SORT_OBJECT_FIELDS is still waiting for 3.0 and it >> is >>>>>>> less >>>>>>>>>> destructive. >>>>>>>>>> >>>>>>>>>> Of course I would also like to hear what other community members >>>> think. >>>>>>>>>> >>>>>>>>>> Regards, >>>>>>>>>> -- >>>>>>>>>> Ilya Kasnacheev >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> пт, 30 апр. 2021 г. в 17:16, Nikolay Izhikov <nizhi...@apache.org >>> : >>>>>>>>>> >>>>>>>>>>> Igniters, >>>>>>>>>>> >>>>>>>>>>> Want to clarify my proposal about new array store format. >>>>>>>>>>> I think we should store array in special binary wrapper that will >>>> keep >>>>>>>>>>> original component type >>>>>>>>>>> >>>>>>>>>>> ``` >>>>>>>>>>> public class BinaryArrayWrapper implements BinaryObjectEx, >>>>>>>>> Externalizable { >>>>>>>>>>> /** Type ID. */ >>>>>>>>>>> private int compTypeId; >>>>>>>>>>> >>>>>>>>>>> /** Raw data. */ >>>>>>>>>>> private String compClsName; >>>>>>>>>>> >>>>>>>>>>> /** Value. */ >>>>>>>>>>> private Object[] arr; >>>>>>>>>>> >>>>>>>>>>> // Further implementation. >>>>>>>>>>> } >>>>>>>>>>> ``` >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> 30 апр. 2021 г., в 16:31, Nikolay Izhikov < >> nizhikov....@gmail.com >>>>> >>>>>>>>>>> написал(а): >>>>>>>>>>>> >>>>>>>>>>>> Hello, Igniters. >>>>>>>>>>>> >>>>>>>>>>>> Currently, binary marshaller works as follows(Say, we have a >> class >>>>>>>>>>> `User` then): >>>>>>>>>>>> >>>>>>>>>>>> IgniteBinary#toBinary(User)` -> BinaryObject >>>>>>>>>>>> IgniteBinary#toBinary(User[])` -> Object[] >>>>>>>>>>>> IgniteBinary#toBinary(Object[])` -> Object[] >>>>>>>>>>>> >>>>>>>>>>>> This means, that we lose array component type information during >>>>>>> binary >>>>>>>>>>> serialization. >>>>>>>>>>>> AFAIK, it’s a design choice made during binary infrastructure >>>>>>>>>>> development. >>>>>>>>>>>> >>>>>>>>>>>> This lead to the following disadvantages: >>>>>>>>>>>> >>>>>>>>>>>> 1. `IgniteBinary` can’t be used as a universal SerDe mechanism. >>>>>>>>>>>> 2. Ignite internals(service grid, .Net calls) contains many >> tweaks >>>>>>> and >>>>>>>>>>> hacks to deal with custom user array and still has many issues >> [1] >>>>>>>>>>>> >>>>>>>>>>>> I propose to make breaking changes and fix the custom user array >>>> SeDe >>>>>>>>> as >>>>>>>>>>> follows: >>>>>>>>>>>> >>>>>>>>>>>> 1. Implement binary serialization that correctly Ser and Deser >>>>>>>>>>> array using some kind of the wrapper (BinaryArrayWrapper). >>>>>>>>>>>> >>>>>>>>>>>> IgniteBinary#toBinary(User)` -> BinaryObject >>>>>>>>>>>> IgniteBinary#toBinary(User[])` -> BinaryObject >>>>>>>>>>>> IgniteBinary#toBinary(Object[])` -> BinaryObject >>>>>>>>>>>> >>>>>>>>>>>> 2. Introduce system flag `IGNITE_USE_BINARY_ARRAY` that enables >>>>>>>>>>> correct SerDe of arrays. The default value is false to keep >>>> backward >>>>>>>>>>> compatibility in the next Ignite release(2.11). >>>>>>>>>>>> >>>>>>>>>>>> 3. Set `IGNITE_USE_BINARY_ARRAY` to `true` in the ongoing >>>> Ignite >>>>>>>>>>> releases (2.12). >>>>>>>>>>>> >>>>>>>>>>>> WDYT? >>>>>>>>>>>> >>>>>>>>>>>> [1] https://issues.apache.org/jira/browse/IGNITE-14299 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>> >>>>>>> >>>>> >>>> >>>> >> >>