Bir dosya biçimi oluşturmanın uygun bir yolu var mı?


12

Ben bilgi kaydetmek ve belki de satır proje varlıkları saklamak için C # .NET yazdım bir uygulama için özel bir dosya biçimi inşa ediyorum. Bunun nasıl yapılacağına dair bir standart var mı? Ben sadece Serializeikili dosyalara gidiyordu ve bana dosyayı nasıl ayrıştırılacağını söyleyecek bir başlık oluşturmak. Bu kötü bir yaklaşım mı?


2
Ben kaçınırdım BinaryFormatter.
CodesInChaos

3
Hangi cevabı seçerseniz seçin (cevaplardan), her zaman formata bir sürüm numarası ekleyin! Sorunuz zaten değişebileceğini gösteriyor ve backwarsd ​​uyumlu olmanız gerekiyorsa sürüm numarası size çok fazla çaba kazandıracak.
Jan Doggen

Biçimi doğru bir şekilde belgelemeyi unutmayın
Basile Starynkevitch

Yanıtlar:


11

En basit yöntem muhtemelen XMLSerializersınıfınızı kullanarak yapınızı XML olarak serileştirmektir . Muhtemelen ayrı bir başlık ve gövde yapısı oluşturmanız gerekmez, ancak tüm varlıkları XML olarak serileştirin. Bu, dosya yapınızı kendi programınızın dışında kolayca incelemenize / düzenlemenize olanak tanır ve kolayca yönetilebilir.

Ancak, dosya yapınız gerçekten karmaşıksa, tüm yapıyı XML'ye serileştirmek çok külfetli olacak şekilde farklı türlerde birçok farklı varlık içerirse, her bir varlığı ayrı ayrı serileştirmeye ve bunları PackagingC # 'daki kütüphaneyi kullanarak tek bir pakette derlemeye bakabilirsiniz. . Aslında .docx, .xslx, .pptx ve diğer ofis dosya biçimleri bu şekilde oluşturulur.


Evet, projem bundan çok daha karmaşık, ancak bunları daha az kullanıcı tarafından okunabilir hale getirmeye çalışıyorum çünkü bunları lisanslı bir bağlamda bir alana dağıtabiliriz. Şu anda protobuf-netverilerimi serileştirmek için kullanıyorum ve bu çok iyi çalışıyor. Ama parçaları ayrı ayrı serileştirmeliyim, bu yüzden Paketleme kütüphanesi ile konuştuğunuz şey ihtiyacım olana benziyor.
corylulu

7
Sevgili tanrı XML değil
James

2
@James evet XML'in dezavantajları var elbette. Çoğu durumda aynı nedenlerden dolayı paketleme ve XML'i tercih ediyorum: 1. önceden var olan bir çerçeve, bu yüzden düşük çaba gerektirir. 2. Yaygın olarak kabul gören bir standart olduğu için diğer sistemlerin desteklemesi kolaydır. 3. Serileştirme işlemini doğrulamak için bir insanın ortaya çıkan dosyayı incelemesi kolaydır.
pswg

XML'in avantajları vardır, ancak bu avantajlardan dolayı XML serileştiricisini kullanmayı sevmiyorum. Ben XML belirli bir biçimde olmasını gerektirir inanıyorum. XML, dosya formatımın zamanla değişmesine ve yine de geriye ve hatta ileriye doğru uyumlu olmasına izin veren yarı yapılandırılmış bir biçimdir. Geçmişte, siparişle ilgili herhangi bir varsayımda bulunmamaya veya gelecekte farkında olmadığım etiketler olmamasına dikkat ederken kendi XML ayrıştırma işlemimi yazdım. XML dosyasının tamamını yükleyebiliyorsanız, XPATH muhtemelen oldukça iyi çalışır. Aksi takdirde daha karmaşık akış ayrıştırma ile solunuz
Alan

Ben içine bakarak önermek istiyorum JSON
Basile Starynkevitch

7

Birçok dosya biçimini ayrıştırmak zorunda olan birinden, bu konuda farklı bir bakış açısıyla en çok görüşe sahibim.

  • İnsanların diğer formatlar için dosya formatı dedektörlerini sizinki gibi tanımlamaması için sihirli numarayı çok benzersiz hale getirin. İkili kullanıyorsanız, sihirli sayı için ikili biçimin başlangıcında rastgele oluşturulmuş 8 veya 16 bayt ayırın. XML kullanıyorsanız, alan adınızda başkalarıyla çakışmaması için uygun bir ad alanı ayırın. JSON kullanıyorsanız, tanrı size yardımcı olur. Belki birileri şu ana kadar bir formatın iğrençliği için bir çözüm bulmuştur.

  • Geriye dönük uyumluluk planlayın. Biçimin sürüm numarasını bir şekilde saklayın, böylece yazılımınızın sonraki sürümleri farklılıklar ile başa çıkabilir.

  • Dosya büyük olabilir veya bir nedenden dolayı insanların atlamak isteyebilecekleri bölümler varsa, bunu yapmanın güzel bir yolu olduğundan emin olun. XML, JSON ve diğer birçok metin formatı bunun için özellikle korkunçtur, çünkü okuyucuyu umursamasalar bile başlangıç ​​ve bitiş öğesi arasındaki tüm verileri ayrıştırmaya zorlarlar. EBML biraz daha iyidir çünkü öğelerin uzunluğunu saklar, sonuna kadar atlamanızı sağlar. Özel bir ikili biçim oluşturursanız, başlıktaki ilk şey olarak bir yığın tanımlayıcı ve bir uzunluk depoladığınız ve okuyucunun tüm parçayı atlayabileceği oldukça yaygın bir tasarım vardır.

  • Tüm dizeleri UTF-8'de saklayın.

  • Uzun süreli genişletilebilirlikle ilgileniyorsanız, tüm tam sayıları değişken uzunlukta bir formda saklayın.

  • Sağlama toplamları iyidir, çünkü okuyucunun dosyanın kafa karıştırıcı sonuçlar doğurabilecek bölümlerine adım atmak yerine geçersiz verileri hemen iptal etmesine izin verir.


+1, json'un bir formatın iğrenç olduğunu düşünen tek kişi olmadığımı fark ettiğim için.
RubberDuck

Neden json için nefret? Biçimi tanımlamak için bilinen bir dizeyi bilinen bir yere koymanız yeterlidir. Sorun çözüldü.
Esben Skov Pedersen

Mükemmel değil, ancak javascript ile sorunsuz çalışır, XML'den daha küçük ve daha küçük boyutta ayrıştırılır ve yine de insan tarafından okunabilir.
corylulu

1
"Neden JSON'dan nefret ediyorsun?" İnsan tarafından okunabilir yorumlar, Unicode'dan kaçmak ve asla boşluk içermemelerine rağmen anahtarları alıntılamamı gerektiren garip bir sözdizimi için destek yok. Ayrıca, her şeyi genişletme konusundaki olağan dışılık, çünkü kimse ad boşluklarını düşünmedi ... bunu çözdüğünüzde, ilk etapta XML'den daha kötü görünen bir şeyle sonuçlanırsınız, her şey için, bir açıdan kaçınmanın yararı parantez?
Haziran'da Trejkaz

Evet, ancak programlamadaki her şeyde olduğu gibi, iş için doğru aracı kullanın. XML'in JSON'dan daha iyi olduğu uygulamalar da vardır.
Temmuz

4

Açıkladığınız şeylerin çok kötü bir yaklaşım olabileceği zamanlar var. Bu, bir dilin / çerçevenin bir nesneyi alıp doğrudan bir tür ikili akışa çıktı verme yeteneğini kullanarak bahsettiğinizi 'serileştir' dediğinizi varsayar. Sorun sınıf yapılarının yıllar içinde değişmesidir. Tüm sınıflarınız daha yeni bir sınıfta değişirse, uygulamanızın önceki bir sürümünde yapılmış bir dosyayı yeniden yükleyebilecek misiniz?

Bir dosya biçiminin uzun vadeli istikrarı için, şimdi kollarınızı biraz yuvarlamayı ve özellikle sınıflarınıza kendi 'serileştirme' / 'akış' yöntemlerinizi yazmayı daha iyi buldum. yani, değerlerin bir akışa elle yazılmasını yönetin. Biçim sürümünü açıklayan bir başlık yazın ve ardından istediğiniz sırada olmasını istediğiniz verileri kaydedin. Okuma tarafında, dosya biçiminin farklı sürümlerini işlemek çok daha kolay hale gelir.

Diğer seçenek elbette XML veya JSON. İkili ağır içerik için mutlaka en büyük değil, basit ve insan tarafından okunabilir ... uzun süreli uygulanabilirlik için büyük bir artı.


Genişletilebilir protobuf-net ( code.google.com/p/protobuf-net ) kullanarak serileştiriyorum . Ancak puanlarınız geçerlidir, ancak, onların buna karşı herhangi bir dosya formatı yöntemi olduğunu düşünmüyorum.
corylulu

Evet ... bu yüzden bazen sadece ellerinizi kirletmeniz ve verilerin elle yazıldığı ve yüklendiği sırayla uğraşmanız gerektiğini söylüyorum.
GrandmasterB

Oluşturduğum uygulama dinamik olmaktan çok uzak ve böyle bir şey için çok fazla değere sahip.
corylulu

1
Uygulama ne kadar karmaşıksa, dosya biçimi üzerinde çok ince kontrol sahibi olmak o kadar önemlidir. Unutmayın, her sınıfın kendi akıcı çıktısı olmamalı ... sadece her sınıf için bunu kontrol etmelisiniz. O zaman bu rutinleri ara.
GrandmasterB

Evet, eski sürümleri modern sürümlere yükselten yöntemlerim var ve sınıflarımın nasıl düzenlendiğine dair çok net bir düzenim var. Bunun için fazla endişelenmiyorum, ama önemli olduğuna katılıyorum. Neredeyse bir yıldır bunun üzerinde çalışıyorum, bu yüzden yapısının nasıl çalıştığına dair oldukça net bir görüşüm var.
corylulu

1

Ben de istiyorum seviyorum kendimden daha yıldan fazla deneyime sahip kişilerden bu soruya cevap duymak.

Çalışmam için kişisel olarak birkaç dosya formatı uyguladım ve bir XML dosya formatı kullanmaya geçtim. Etkileşimlerim ve etkileşimde bulunduğum donanım sürekli değişiyor ve gelecekte formata ne eklemem gerektiğini söyleyemiyorum. XML'in birincil avantajlarından biri, yarı yapılandırılmış olmasıdır . Bu nedenle, genellikle .NET'in sağladığı otomatik XML Serileştirmesinden kaçınırım çünkü tam bir biçim beklemeye zorladığına inanıyorum.

Amacım, gelecekte yeni öğeler ve niteliklerin eklenmesine ve etiketlerin sırasının mümkün olduğunca önemli olmamasına izin veren bir XML biçimi oluşturmaktı. Dosyanızın tamamını belleğe yükleyebileceğinizden eminseniz, XPATH muhtemelen iyi bir seçimdir.

Özellikle büyük dosyalarla uğraşıyorsanız veya başka nedenlerle dosyayı bir kerede yükleyemiyorsanız, muhtemelen bir XmlStreamReader kullanmanız ve bilinen öğeleri taramanız ve ReadSubtree ile tekrar tekrar taramanız ve tekrar taramanız ...


Bu cevap Q'ya çok yönelik değildir, bu site bir tartışma panosu değildir, spekülatif olmayan Soru-Cevap için tasarlanmıştır. Yanıtınızda, sorucının yaklaşımının neden iyi veya iyi olmadığına dair bir öneride bulunmak için kullanılabilecek bazı geçerli puanlarınız var, ancak çok odaklanmış değil. Lütfen cevabınızı soruya biraz daha odaklayın, teşekkürler!
Jimmy Hoffa

@JimmyHoffa Cevabım OP'nin sorusunu da desteklese de, XML yarı yapılandırılmış bir yaklaşım önerdiğimi netleştirdim .. ama ne demek istediğini anlıyorum, düzenleyebilirim
Alan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.