Autor Wątek: Zapisywanie struktury/klasy do pliku  (Przeczytany 2571 razy)

Offline ShadowDancer

  • Redaktor

# Marzec 22, 2010, 15:47:18
Otóż sklepałem sobie bardzo fajny map edytor w C#(windows forms) i coś mnie chce trafić, jak chcę zapisać dane do pliku i odczytać w C++. Czytałem o serializacji, ale nijak nie mogę tego odczytać w c++. Ma już ktoś doświadczenia z tym?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Asmodeusz

  • Użytkownik
    • Bogumił Wiatrowski: Blog

# Marzec 22, 2010, 15:59:25
W .NET masz domyślnie chyba z 4 sposoby serializacji danych. Osobiście proponuję napisać sobie własną metodę serializującą/deserializującą i zapisywać za pomocą BinaryWriter/BinaryReader. Opcjonalnie, jeśli lubisz babrać się w C#, użyj System.Xml.Serialization i w C++ie wczytuj obiekt jako XMLa.

Offline ShadowDancer

  • Redaktor

# Marzec 22, 2010, 16:02:24
Własną metodę serializującą - masz na myśli Bw.Write(zmienna)? Nie da się zrobić coś w stylu c++ - przekonwertować na tablicę bajtów i zapisać?

Offline Asmodeusz

  • Użytkownik
    • Bogumił Wiatrowski: Blog

# Marzec 22, 2010, 16:23:13
Własną metodę serializującą - masz na myśli Bw.Write(zmienna)? Nie da się zrobić coś w stylu c++ - przekonwertować na tablicę bajtów i zapisać?
Teoretycznie - jest taka możliwość. Namespace System.Runtime.InteropServices i klasa Marshal. Mimo wszystko jest to bardzo niezalecane rozwiązanie (używane właściwie tylko do przekazywania .NETowych struktur do natywnych wywołań), możliwe, że w końcu wyleci z platformy.

Własna serializacja jest o tyle dobra, że sam dokładnie kontrolujesz co, jak i dlaczego zapisujesz. Wg. specyfikacji .NET ma prawo typy inne niż proste wbudowane (wszelkie odmiany int i decimal) zapisywać w kompletnie dowolny sposób. Czyli: jedna implementacja może zapisywać string jako ciąg kończący się '\0', inna - jako [rozmiar:32][string nie kończący się '\0']. Wymagane jest tylko, żeby było to jednoznacznie oznaczone i dające się rozpoznać.

Offline FrostBite

  • Użytkownik

# Marzec 22, 2010, 16:49:00
Zawsze możesz skorzystać z dobrodziejstw C++\CLI i zrobić jakąś proxy klase, która użyta w .NET będzie wołać funkcje klasy, której używasz w natywnym C++.

Offline ShadowDancer

  • Redaktor

# Marzec 22, 2010, 16:50:02
Eeech, chyba szlag mnie trafi z tym c#. Daruje to sobie, napiszę edytor w c++...

Offline Esidar

  • Użytkownik

# Marzec 22, 2010, 16:54:53
Eeech, chyba szlag mnie trafi z tym c#. Daruje to sobie, napiszę edytor w c++...
lol :) A ja mam głupie pytanie. Jak już napiszesz to w c++ i zmienisz sobie strukturę (dodasz 1 zmienną) to jak rozwiążesz wczytywanie starych plików ?

Offline ShadowDancer

  • Redaktor

# Marzec 22, 2010, 17:03:13
Nie zamierzam zmieniać struktury, ew. napiszę konwenter. Będzie szybciej, niż zgadywanie, gdzie kompilator dał int16, a gdzie int32...

therealremi

  • Gość
# Marzec 22, 2010, 17:18:01
Ale czemu nie wchodzi w grę zapisywanie w trybie tekstowym?
Wiem, że w NET można automatycznie serializować do XML. Natomiast gdybyś nie chciał odczytywać XML w c++ to masz dwa wyjścia:
1. poszukać jak zmienić format serializacji w NET na jakiś lżejszy niż XML (ktoś to robił?)
2. stworzyć w C# klasę Serializator, która dostaje obiekt i poprzez refleksje zapisuje wszystkie jego pola w trybie tekstowym, w jakim chcesz formacie.

Offline FrostBite

  • Użytkownik

# Marzec 22, 2010, 17:23:51
Proxy klasa w C++\CLI nie jest niczym wielkim do napisania, a pozwala zaprzęgnąć tą samą klasę z C++ do edytora w C#.

Offline sasik

  • Użytkownik

# Marzec 22, 2010, 18:24:17
Boost::serialization umożliwia zapis/odczyt do XMLa i jest dość wygodny w użyciu. Jeśli XML bardzo ci nie odpowiada, możesz jeszcze spróbować JSONem (w .NET 3.5 jest do tego gotowa metoda).

Edit:
Ciekawostka z XMLem w c++ http://www.codesynthesis.com/products/xsd/
« Ostatnia zmiana: Marzec 23, 2010, 12:49:47 wysłana przez sasik »

Offline siso

  • Użytkownik

# Marzec 23, 2010, 00:21:38
Jeśli XML bardzo ci nie odpowiada, możesz jeszcze spróbować JSONem
Tak pierwsza, jak i druga metoda uwolni Cię od konieczności pisania konwertera przy zmianie formatu. Jeśli jednak miałbym wybierać, wybrałbym JSON-a. Przy dużo mniejszej objętości pozwala przekazać te samą treść, co XML. Wynikowy format jest bardzo czytelny. Jeśli jeszcze .NET ma do tego wsparcie - nie ma się nad czym zastanawiać.