.NET: BinaryFormatter vyhazuje SerializationException

DaN

.NET: BinaryFormatter vyhazuje SerializationException
« kdy: 26. 11. 2013, 13:42:14 »
Provádím deserializaci pomocí:

Kód: [Vybrat]
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
using (MemoryStream memoryStream = new MemoryStream(buffer))
{
    object test = binaryFormatter.Deserialize(memoryStream); //[4]
}

Na řádku [4] to vyhodí SerializationException "Sestavení XY.dll Version 1.2.0.0 bla bla...nebylo nalezeno" .
V aplikaci existuje podepsaná assembly XY, ale ve verzi 1.3.0. Očekával bych, vzhledem k nastavení FormatterAssemblyStyle.Simple, toleranci vůči verzi, ale přesto to vyletí na výjimku.
Nevíte proč?
Děkuji
« Poslední změna: 27. 11. 2013, 10:16:51 od Petr Krčmář »


Provádím deserializaci pomocí:

BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
using (MemoryStream memoryStream = new MemoryStream(buffer))
{
    object test = binaryFormatter.Deserialize(memoryStream); //[4]
}

Na řádku [4] to vyhodí SerializationException "Sestavení XY.dll Version 1.2.0.0 bla bla...nebylo nalezeno" .
V aplikaci existuje podepsaná assembly XY, ale ve verzi 1.3.0. Očekával bych, vzhledem k nastavení FormatterAssemblyStyle.Simple, toleranci vůči verzi, ale přesto to vyletí na výjimku.
Nevíte proč?
Děkuji

Lebo nesedi verzia. Ten BinaryFormatter je pekna prasarna. Ak chces 100%nu kompatibilitu tak tie data by bolo dobre ukladat priamo cez binarywriter. Struct sa da prekonvertovat na byte array pomocou Marshal.StructureToPtr a Marshal.Copy

DaN

Re:.NET: BinaryFormatter vyhazuje SerializationException
« Odpověď #2 kdy: 27. 11. 2013, 14:11:54 »
Díky za odpověď, rozumím.
Máš nějaké praktické zkušenosti hlavně co se týká použití na hodně strukturovaných byznys objektech?
Provedl jsem pár testů na své jednoduché třídě, která si drží odkaz na instanci z jiné jednoduché pokusné třídy a funguje to jak má, včetně tolerance k novým fíldům, resp. i po odstranění exitujících fildů.
V reálné aplikaci mám ale byznys objekty složité, jsou to strukturované kompozity odvozené od bázových tříd z frameworku CSLAhttp://www.lhotka.net/cslanet/, typicky z třídy BusinessBase<T>. CSLA klade na nároky na stav objektu, např. je třeba registrovat vlastnosti instance do různých bázových factories apod.
Obávám se záludných chyb ať už při implementaci nebo hůře v runtime.


DaN

Re:.NET: BinaryFormatter vyhazuje SerializationException
« Odpověď #3 kdy: 27. 11. 2013, 17:10:27 »
Zdá se, že simple mód binary formateru bez dodání vlastního bindera je dost nedeterministický. Někdy mu změna verzí nevadí, někdy ano, jako by zohledňoval i změnu ve struktuře třídy.
S dodáním vlastního bindera se jeví jako deterministický, tedy alespoň na jednoduších POCO objektech.
V případě používání CSLA frameworku ale nepomůže ani simple mód s vlastním binderem, CSLA spolehlivě vyhazuje při deserializaci výjimky.

Abych to shrnul, vestavěné .NET serializery jsou v podstatě k ničemu, pokud člověk chce uchovávat i stav privátních fíldů u komplexních objektů a potřebuje toleranci k verzím.