2010-07-15 18 views
5

Aşağıdaki sorunla karşılaşıyorum. Diskteki tek bir dosyaya bir nesne akışı (ikili) (ikili) serialize etmem gerekiyor. Seri hale getirme kısmı bir sorun değildir, sadece ekleme modunda bir akış açın ve .Net'in BinaryFormatter Serialize yöntemini kullanın ve işiniz bitti. Bu yaklaşımdaki problem, bu akışı sadece BinaryFormatter'ın serileştirme işlevine verememektir, içerdiği şey serileştirdiğim nesnenin tek bir örneği değildir.İkili (De) 1 dosyaya bir nesne akışının serileştirilmesi

bu soruna ortak bir çözüm var mı? Belirli bir akışa serileştirilen tüm nesneler aynı tiptedir, bu yüzden en azından ne seri hale getirileceğine karar vermemize gerek yok, bu verilen bir şeydir, ama bu bana bir çıkış yolu önermez.

cevaplar dayalı Açıklama: büyük olması bekleniyor gönderilen nesne sayısı ve belleğe hepsini yüklemek için gerektirecektir diske flush (a sarıcı koleksiyonundaki hepsini tutmak için bu nedenle olanaksız olduğunu -> yenilerini ekleyin -> diske yıkayın). Tek bir nesne seri zaman

  • Normalde içeren bir dosyayı almak:

Ne oluşturma içeren bir dosyadır

  • [Nesne]:

[Nesne] [Object] [Object] [Object] ... [Nesne]

Ve ayrı Nesne örneklerini deserialize etmem gerekiyor.

Şimdiden teşekkürler!

Cevap:

while (fileStream.Position < fileStream.Length) 
    messages.Add((Message)formatter.Deserialize(fileStream)); 

BinaryFormatter bir nesne deserialize olacaktır: Cevap (yeterli açıklıkta) Bu Konuda ima, ancak açıkça belirtilmediği asla beri, ben burada ifade edeceğiz düşünce İstediğiniz gibi bir zamanda :) Dosyayı her çağırdığınızda uzunlukları yavaşlattığından, uzunlukları yavaşlattığından, fileStream.Length özelliğini önbelleğe almak isteyebilirsiniz. Bu soruyu göndermeden önce ilk kez denemediğim için hiçbir fikrim yok, ama şimdi kusursuz çalışıyor.

cevap

1

sonra, (I Liste seri hale getirilebilir inanıyoruz) bir seri hale getirilebilir koleksiyon içine nesneleri koyarak (de) açıklamaya dayanarak nesne

o EDIT seri deneyin: Sadece bu soru aynı cevabı olduğunu fark bu şekilde question. denemek ve bir cevap yeniden icat yerine, sadece Mark Gravell cevabı bakmak veya this one

+0

nesneler sisteminin ömrü süresince şekilde akmaktadır ve beklenen bunların çok büyük bir sayıdır , Yıkamalıyım.Bunları sarmalayıcı koleksiyonunda tuttuğumda, hepsini bellekte tutmalı ve diske yıkamak istediğim her zaman tüm dosyayı yeniden yazmam gerekecek. – United

+0

ilk öneri işe yaramaz, başka bir kütüphaneye ihtiyaç duyduğu için (yasal olarak 6 aylık + onay süreci, eğer şanslıysam). İkincisi ilgi çekicidir. İkinci cevap için, koleksiyondaki nesneler olmaksızın bir dosyadan nesnelerin serisini serileştirmek için normal serileştirmeye sahip oldukları görülüyor. Çalışmamış olan testlerimde, sanırım daha fazla araştırmaya çalışacağım + belki de bu SO sorusunda takip edebilirim. – United

0

bir seri hale olan bir dosya için, bu yüzden size ne yapacağını bir dosyaya doğrudan akışı gönderme düşünürdüm ediyorum İstemek gibi görünüyor. Durumunuza dair daha spesifik bir açıklama, daha yararlı bir cevap verebilmek için yardımcı olacaktır. (Ben 'açıklama' olarak girmek isterdim ama açıklama düğmesi bana kullanılamaz nasılsa.)

+0

Seri hale getirme sorun değil. Sorun şu ki, bir nesneyi bir seferde serileştirirseniz (ki bunu yapmalıyım) ve bunları bir akışa eklerseniz, sonuçta elde edilen akışı salıveremiyorum çünkü tüm akış tek bir nesneyi temsil etmiyor. – United

+0

Temel olarak, normalde bir nesneyi bir dosyaya serileştirdiğinizde, dosya, bir nesneyi (yani [Nesne]), böylece nesnenin seri hale getirilmesini sağlar; Object obj = binaryFormatter.Deserialize (fs, MyObjType); Sahip olduğum şey [Object] [Object] ... [Object] dosyasıdır, bu yüzden deserialize fonksiyonunu tek bir nesnenin bir serileştirmesi olmadığı için, bu dosyadaki serileştirme işlevini çağıramam. – United

+0

Düşündüğüm şey, içine bir sınırlayıcı koydu (bir serileştiricinin asla üretemeyeceği sembollerin bir kombinasyonu var ise). Böylelikle dosyayı tek akışta parçalara (tek seri hale getirilmiş nesneyi temsil eden) el ile ayrıştırabilir ve parçaları başka bir akışa gönderebilir ve bu da sırayla desiterleştiriciye verilir. – United

İlgili konular