Saya sedang membangun format file berpemilik untuk aplikasi yang saya tulis di C # .NET untuk menyimpan informasi simpanan dan mungkin di masa mendatang aset proyek. Apakah ada standar tentang cara melakukan ini dengan cara apa pun? Saya hanya pergi ke Serialize
objek saya menjadi biner dan membuat header yang akan memberi tahu saya bagaimana mengurai file. Apakah ini pendekatan yang buruk?
c#
.net
file-structure
corylulu
sumber
sumber
BinaryFormatter
.Jawaban:
Metode paling mudah mungkin adalah membuat cerita bersambung struktur Anda ke XML menggunakan
XMLSerializer
kelas. Anda mungkin tidak perlu membuat tajuk dan struktur tubuh yang terpisah - tetapi serialkan semua aset ke dalam XML. Ini memungkinkan Anda untuk dengan mudah memeriksa / mengedit struktur file Anda di luar program Anda sendiri, dan mudah dikelola.Namun, jika struktur file Anda benar-benar kompleks, mengandung banyak aset yang berbeda dari jenis yang berbeda, sehingga membuat serialisasi seluruh struktur menjadi XML terlalu berat, Anda mungkin melihat membuat serial setiap aset secara terpisah dan menyusunnya menjadi satu paket menggunakan
Packaging
perpustakaan di C # . Ini pada dasarnya bagaimana .docx, .xslx, .pptx, dan format file office lainnya dibuat.sumber
protobuf-net
untuk mengelompokkan data saya dan banyak yang berfungsi dengan baik. Tapi saya harus membuat serial potongan-potongan secara terpisah, jadi apa yang Anda bicarakan dengan perpustakaan Pengemasan terdengar seperti yang saya butuhkan.Dari seseorang yang harus mem-parsing banyak format file, saya punya pendapat tentang ini dari sudut pandang yang berbeda untuk sebagian besar.
Buat angka ajaib sangat unik sehingga detektor format file orang untuk format lain tidak salah mengidentifikasi sebagai milik Anda. Jika Anda menggunakan biner, alokasikan 8 atau 16 byte yang dihasilkan secara acak di awal format biner untuk angka ajaib. Jika Anda menggunakan XML, alokasikan namespace yang tepat di domain Anda sehingga tidak dapat berbenturan dengan orang lain. Jika Anda menggunakan JSON, tuhan bantu Anda. Mungkin seseorang telah memilah solusi untuk kekejaman format sekarang.
Rencanakan kompatibilitas mundur. Simpan nomor versi format dengan cara apa pun sehingga versi perangkat lunak Anda nanti dapat mengatasi perbedaan.
Jika file bisa besar, atau ada bagian yang orang mungkin ingin lewati karena alasan tertentu, pastikan ada cara yang bagus untuk melakukan ini. XML, JSON dan sebagian besar format teks lainnya sangat buruk untuk ini, karena mereka memaksa pembaca untuk mem-parsing semua data antara elemen awal dan akhir bahkan jika mereka tidak peduli. EBML agak lebih baik karena menyimpan panjang elemen, memungkinkan Anda untuk melewati semua jalan sampai akhir. Jika Anda membuat format biner kustom, ada desain yang cukup umum di mana Anda menyimpan pengidentifikasi potongan dan panjang sebagai hal pertama di header, dan kemudian pembaca dapat melewati seluruh potongan.
Simpan semua string di UTF-8.
Jika Anda peduli tentang ekstensibilitas jangka panjang, simpan semua bilangan bulat dalam bentuk variabel panjang.
Checksum sangat bagus karena memungkinkan pembaca untuk segera membatalkan data yang tidak valid, daripada berpotensi melangkah ke bagian file yang dapat menghasilkan hasil yang membingungkan.
sumber
Nah, ada kalanya yang Anda gambarkan bisa menjadi pendekatan yang sangat buruk. Ini mengasumsikan ketika Anda mengatakan 'cerita bersambung' Anda sedang berbicara tentang menggunakan kemampuan bahasa / kerangka kerja untuk hanya mengambil objek dan output langsung ke semacam aliran biner. Masalahnya adalah struktur kelas berubah selama bertahun-tahun. Apakah Anda dapat memuat ulang file yang dibuat dalam versi aplikasi Anda sebelumnya jika semua kelas Anda berubah menjadi yang lebih baru?
Untuk stabilitas jangka panjang dari format file, saya merasa lebih baik menyingsingkan lengan baju Anda sekarang dan secara khusus menulis metode 'serialisasi' / 'streaming' Anda sendiri di dalam kelas Anda. yaitu, secara manual menangani penulisan nilai ke aliran. Tulis header saat Anda menyatakan yang menggambarkan versi format, dan kemudian data yang Anda inginkan disimpan dalam urutan yang Anda inginkan. Di sisi membaca, menangani berbagai versi format file menjadi jauh lebih mudah.
Pilihan lain tentu saja adalah XML atau JSON. Belum tentu yang terbaik untuk konten biner berat, tetapi sederhana dan dapat dibaca manusia ... plus besar untuk kelangsungan jangka panjang.
sumber
Saya juga akan senang mendengar jawaban pertanyaan ini dari orang-orang dengan tahun pengalaman lebih dari diriku sendiri.
Saya secara pribadi telah mengimplementasikan beberapa format file untuk pekerjaan saya, dan saya telah pindah ke menggunakan format file XML. Persyaratan dan perangkat keras saya yang berinteraksi dengan saya berubah setiap saat, dan tidak ada yang tahu apa yang perlu saya tambahkan ke format di masa mendatang. Salah satu keunggulan utama XML adalah semi-terstruktur . Untuk alasan ini, saya biasanya menghindari Serialisasi XML otomatis yang disediakan oleh .NET karena saya percaya itu memaksa untuk mengharapkan format yang tepat.
Tujuan saya adalah membuat format XML yang memungkinkan elemen dan atribut baru ditambahkan di masa depan dan agar urutan tag tidak menjadi masalah bila memungkinkan. Jika Anda yakin bahwa Anda dapat memuat seluruh file Anda ke dalam memori maka XPATH mungkin merupakan pilihan yang baik.
Jika Anda berurusan dengan file yang sangat besar, atau karena alasan lain tidak dapat memuat file sekaligus, maka Anda mungkin dibiarkan menggunakan XmlStreamReader dan memindai elemen yang diketahui dan berulang ke elemen-elemen tersebut dengan ReadSubtree dan memindai lagi ...
sumber