none
BinaryReader ile Dictionary<E,int> Okumak/Yazmak RRS feed

  • Soru

  • Herkese Merhabar,

    Save/Load sistemi yapıyorum. Temel olan herşeyi yaptım: int, string, long, datetime,  ve diğer dictionary işlemleri için araya virgül koyupta çevirdim (Dic<string,string> to str, tam tersi vs.) Fakat ;


    //YAZ
     
    public static void WriteEnumIntDictionary<E>(BinaryWriter writer, IDictionary<E, int> dict) {
                writer.Write(dict.Count);
                foreach (KeyValuePair<E, int> current in dict) {
                    string name = Enum.GetName(typeof(E), current.Key);
                    if (name == null) {
                        throw new IOException("Key is not enum constant");
                    }
                    writer.Write(name);
                    writer.Write(current.Value);
                }
            }
    
    //OKU
    
     public static Dictionary<E, int> ReadEnumIntDictionary<E>(BinaryReader reader) {
                int num = reader.ReadInt32();
                Dictionary<E, int> dictionary = new Dictionary<E, int>(num);
                Type typeFromHandle = typeof(E);
                for (int i = 0; i < num; i++) {
                    string value = reader.ReadString();
                    int value2 = reader.ReadInt32();
                    E key = (E)((object)Enum.Parse(typeFromHandle, value, true));
                    dictionary[key] = value2;
                }
                return dictionary;
            }

    Bunları işlemlerin en sonuna ekledim. Kayıt ederken sıkıntı yok fakat okurken var. ReadInt32() değeri 1milyon kusür gibi absürt bir değer veriyor, exception olarak da OutOfMemory hatası veriyor. Çok fazla dictionary açtığı için. Kendim enum sayısı kadar değer verdiğim zamanda okumuyor, ArgumentException veriyor. Ben bunu nasıl kaydedebilirim ? Nerede hata yapıyorum ? Teorik olarak yanlış biryer yok. Pek anlayamadım açıkcası.

    Şimdiden teşekkürler...

    4 Ekim 2016 Salı 10:57

Yanıtlar

  • anlamadım? 250 değişkene serialize eklemene gerek yok classa Serializeable eklemen yeterli

    BinaryFormatter bf = new BinaryFormatter();
    using (var fs = new FileStream("file.dat", FileMode.OpenOrCreate))
    {
        bf.Serialize(fs, saveEdeceğinInstance);
        fs.Close();
    }


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    5 Ekim 2016 Çarşamba 09:07
    Moderatör

Tüm Yanıtlar

  • Save/Load için neden BinaryFormatter kullanmıyorsun?

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    5 Ekim 2016 Çarşamba 07:31
    Moderatör
  • Save/Load için neden BinaryFormatter kullanmıyorsun?

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com


    Hocam aslında serileştirme benimde sonradan aklıma geldi. Şuan 250 civarı değişken var Save/Load olan. Dictionary, Enum kayıtlar vs. de olacak. Direkt [Serializable] eklesem olurmu ? Serileştirilen bir class da illaki bir sıkıntı çıkıyor forumlarda çok soruluyor birde. Nasıl yapmalıyım ?
    5 Ekim 2016 Çarşamba 08:12
  • anlamadım? 250 değişkene serialize eklemene gerek yok classa Serializeable eklemen yeterli

    BinaryFormatter bf = new BinaryFormatter();
    using (var fs = new FileStream("file.dat", FileMode.OpenOrCreate))
    {
        bf.Serialize(fs, saveEdeceğinInstance);
        fs.Close();
    }


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    5 Ekim 2016 Çarşamba 09:07
    Moderatör