2015-08-29 2 views
0

Как я могу записать хэш-таблицу в файл, не зная, что в нем?!Как написать Hashtable в файл?

Hashtable DTVector = new Hashtable(); 

просто сохраните это в файле, затем прочитайте его и создайте хэш-таблицу снова.

+1

Смотрите обсуждение здесь: http://stackoverflow.com/questions/10615896/serialize-hashtable -using-protocol-buffers-net автор поставил решение. Я не могу говорить о его качестве. –

+0

Знаете ли вы, какие типы будут в нем? Я не имею в виду точные экземпляры, только возможные типы на нем (классы, которыми вы владеете, рамки classess ...) – Gusman

+0

@ Gusman что-то вроде 2D-массива. –

ответ

5

Если вы храните только парные разряды в своей Hashtable, вы можете использовать BinaryFormatter, чтобы получить serialize and deserialize свою структуру данных.

Hashtable DTVector = new Hashtable(); 

DTVector.Add("key",12); 
DTVector.Add("foo",42.42); 
DTVector.Add("bar",42*42); 

// write the data to a file 
var binformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
using(var fs = File.Create("c:\\temp\\vector.bin")) 
{ 
    binformatter.Serialize(fs, DTVector); 
} 

// read the data from the file 
Hashtable vectorDeserialized = null; 
using(var fs = File.Open("c:\\temp\\vector.bin", FileMode.Open)) 
{ 
    vectorDeserialized = (Hashtable) binformatter.Deserialize(fs); 
} 

// show the result 
foreach(DictionaryEntry entry in vectorDeserialized) 
{ 
    Console.WriteLine("{0}={1}", entry.Key,entry.Value); 
} 

Имейте в виду, что объекты, которые вы добавляете в свою Hashtable, должны быть сериализуемыми. Типы значений в структуре .Net и некоторые другие классы.

Если вы создали свой собственный класс, как это:

public class SomeData 
{ 
    public Double Value {get;set;} 
} 

И добавить экземпляр в Hashtable как так:

DTVector.Add("key",new SomeData {Value=12}); 

Вы будете встречены с исключением при вызове Последовательность:

Тип 'SomeData' в сборке 'blah' не обозначен как serializable.

Вы можете следить за подсказку, указанную в сообщении исключения, добавив атрибут Serializable к классу

[Serializable] 
public class SomeData 
{ 
    public Double Value {get;set;} 
    public override string ToString() 
    { 
     return String.Format("Awesome! {0}", Value); 
    } 
} 
0

В конечном счете, я думаю, что для легкости объектов можно создавать объекты, которые должны быть сериализуемыми. Вы могли бы использовать что-то вроде реализации protobuf dotnet, чтобы сохранить его более эффективно, чем просто простой дамп в файл.

Смежные вопросы