Tworzę zastrzeżony format pliku dla aplikacji napisanej w C # .NET do przechowywania informacji o zapisywaniu i być może w dół zasobów projektu. Czy istnieje standard, jak to zrobić w jakikolwiek sposób? Po prostu przechodziłem do Serialize
moich obiektów w formacie binarnym i tworzyłem nagłówek, który powiedziałby mi, jak parsować plik. Czy to złe podejście?
c#
.net
file-structure
Corylulu
źródło
źródło
BinaryFormatter
.Odpowiedzi:
Najprostszą metodą jest prawdopodobnie serializacja struktury do XML przy użyciu
XMLSerializer
klasy. Prawdopodobnie nie trzeba tworzyć osobnego nagłówka i struktury treści - ale serializować wszystkie zasoby do formatu XML. Pozwala to na łatwą kontrolę / edycję struktury plików poza własnym programem i jest łatwy do zarządzania.Jeśli jednak struktura plików jest naprawdę złożona i zawiera wiele różnych zasobów różnych typów, na przykład szeregowanie całej struktury do formatu XML jest zbyt uciążliwe, możesz rozważyć szeregowanie każdego zasobu osobno i skompilowanie ich w jednym pakiecie przy użyciu
Packaging
biblioteki w języku C # . Zasadniczo tak powstają pliki .docx, .xslx, .pptx i inne formaty plików biurowych.źródło
protobuf-net
do serializacji moich danych i tyle działa świetnie. Ale muszę oddzielnie serializować utwory, więc to, o czym mówisz z biblioteką opakowań, brzmi jak to, czego potrzebuję.Od kogoś, kto musiał przeanalizować wiele formatów plików, mam na ten temat opinie z innego punktu widzenia niż większość.
Spraw, aby magiczna liczba była bardzo unikalna, aby ludzkie detektory formatu plików dla innych formatów nie identyfikowały jej jako twojej. Jeśli używasz pliku binarnego, przydziel 8 lub 16 losowo wygenerowanych bajtów na początku formatu binarnego dla liczby magicznej. Jeśli używasz XML, przydziel odpowiednią przestrzeń nazw w swojej domenie, aby nie mogła kolidować z innymi osobami. Jeśli używasz JSON, niech Bóg ci pomoże. Być może ktoś już wymyślił rozwiązanie tej obrzydliwości formatu.
Zaplanuj zgodność wsteczną. Przechowuj numer wersji tego formatu, aby późniejsze wersje oprogramowania radziły sobie z różnicami.
Jeśli plik może być duży lub istnieją jego sekcje, które ludzie mogą chcieć pominąć z jakiegoś powodu, upewnij się, że jest to dobry sposób na zrobienie tego. XML, JSON i większość innych formatów tekstowych są szczególnie straszne, ponieważ zmuszają czytelnika do parsowania wszystkich danych między elementem początkowym i końcowym, nawet jeśli ich to nie obchodzi. EBML jest nieco lepszy, ponieważ przechowuje długość elementów, umożliwiając przeskakiwanie do samego końca. Jeśli utworzysz niestandardowy format binarny, istnieje dość powszechny projekt, w którym jako pierwszy element w nagłówku zapisujesz identyfikator porcji i długość, a następnie czytnik może pominąć cały fragment.
Przechowuj wszystkie ciągi znaków w UTF-8.
Jeśli zależy Ci na długoterminowej rozszerzalności, przechowuj wszystkie liczby całkowite w postaci zmiennej długości.
Sumy kontrolne są fajne, ponieważ pozwalają czytelnikowi natychmiast przerwać nieprawidłowe dane, zamiast potencjalnie wchodzić w sekcje pliku, które mogą dawać mylące wyniki.
źródło
Czasami to, co opisujesz, może być bardzo złym podejściem. Zakłada się to, gdy mówisz „serializuj”, że mówisz o użyciu umiejętności języka / frameworku, aby po prostu wziąć obiekt i wyprowadzić bezpośrednio do jakiegoś strumienia binarnego. Problemem jest zmiana struktur klasowych na przestrzeni lat. Czy będzie można ponownie załadować plik utworzony w poprzedniej wersji aplikacji, jeśli wszystkie klasy zmienią się w nowszej?
Aby uzyskać długoterminową stabilność formatu pliku, uważam, że lepiej jest teraz zakasać rękawy i napisać własne metody „serializacji” / „przesyłania strumieniowego” w swoich klasach. tzn. ręcznie obsłużyć zapisywanie wartości do strumienia. Napisz nagłówek, jak podajesz, opisujący wersję formatu, a następnie dane, które chcesz zapisać w kolejności, w jakiej chcesz. Po stronie odczytu obsługa różnych wersji formatu pliku jest znacznie łatwiejsza.
Inną opcją jest oczywiście XML lub JSON. Niekoniecznie najlepszy w przypadku ciężkich treści binarnych, ale prosty i czytelny dla człowieka ... duży plus za długoterminową rentowność.
źródło
Ja również uwielbiam usłyszeć odpowiedź na to pytanie od ludzi z lat więcej doświadczenia niż ja.
Osobiście zaimplementowałem kilka formatów plików do swojej pracy i przeszedłem do używania formatu pliku XML. Moje wymagania i sprzęt, z którym współpracuję, zmieniają się cały czas i nie wiadomo, co będę musiał dodać do formatu w przyszłości. Jedną z głównych zalet XML jest to, że jest częściowo ustrukturyzowany . Z tego powodu generalnie unikam automatycznej serializacji XML, którą zapewnia .NET, ponieważ uważam, że zmusza go do oczekiwania na dokładny format.
Moim celem było stworzenie formatu XML, który pozwalałby na dodawanie nowych elementów i atrybutów w przyszłości oraz aby kolejność znaczników nie miała znaczenia, o ile to możliwe. Jeśli masz pewność, że możesz załadować cały plik do pamięci, XPATH jest prawdopodobnie dobrym wyborem.
Jeśli masz do czynienia ze szczególnie dużymi plikami lub z innych powodów nie możesz załadować pliku naraz, prawdopodobnie prawdopodobnie pozostaje Ci użycie XmlStreamReader i skanowanie w poszukiwaniu znanych elementów i rekurencja w te elementy za pomocą ReadSubtree i ponowne skanowanie ...
źródło