Omdat ik een klein programmaatje wil distribueren met alléén de executable, en ik in dat kleine programma een vrij grote hash map gebruik die in principe niet verandert, heb ik deze hash map geserialized en in een file gestopt. Deze file heb ik vervolgens als resource in een .resx-bestand gestopt, en deze aan mijn project gekoppeld. Dat lijkt te werken, gezien het volgende geen exception geeft:
Dit is het eerste wat ik sinds tijden met C# doe, dus het is even wennen. In Python kan je een memory stream maken die de link zou kunnen vormen tussen GetObject en de BinaryFormatter, misschien kan dat in C# ook wel. Ik heb helaas nog niet gevonden hoe, ondanks Google en MSDN. Iemand een suggestie?
Overigens is een alternatieve aanpak ook welkom, als het maar één executable blijft en ik niet vanuit code de hash map moet gaan opvullen bij het opstarten.
C#:
Maar nu. Met GetObject kan ik er bij, naar het schijnt. Maar het volgende werkt niet:1
2
| ResourceManager resourceManager = new ResourceManager ("SqGen.ICAO", GetType ().Assembly); |
C#:
Als ik de boven genoemde file, die ik dus in een resource heb gestopt, wil lezen, dus wil deserializen uit die file, dan gebruik ik een BinaryFormatter, en dat werkt voor een losse file prima maar die wil een stream zien, en geen resourceManager.GetObject (). Dit werkt dus ook niet:1
2
| deBetreffendeHashtable = (System.Collections.Hashtable) resourceManager.GetObject ("airportICAO"); |
C#:
Concreet is dus mijn vraag: Hoe stop ik een geserialized object dat in een resource zit weer terug in het programma zodat ik hem kan gebruiken?1
2
3
| BinaryFormatter bformatter = new BinaryFormatter(); deBetreffendeHashtable = (System.Collections.Hashtable) bformatter.Deserialize(resourceManager.GetObject ("airportICAO")); |
Dit is het eerste wat ik sinds tijden met C# doe, dus het is even wennen. In Python kan je een memory stream maken die de link zou kunnen vormen tussen GetObject en de BinaryFormatter, misschien kan dat in C# ook wel. Ik heb helaas nog niet gevonden hoe, ondanks Google en MSDN. Iemand een suggestie?
Overigens is een alternatieve aanpak ook welkom, als het maar één executable blijft en ik niet vanuit code de hash map moet gaan opvullen bij het opstarten.