2012-03-27 3 views
2

사전은 Dictionary<string, object>이고 사전은 문자열 키와 개체를 값으로 보유합니다. 저장하고 나중에 해당 사전을로드해야합니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?파일을 저장할 개체가있는 사전 작성

+4

http://www.dacris.com/blog/2010/07/31/c-serializable-dictionary-a-working-example/ –

+0

해당 클래스 사용 방법을 이해할 수 없습니다. 새 SerializableDictionary () 객체를 만들고 저장 /로드하는 방법은 무엇입니까? – Tomas

답변

3

당신이 직렬화 Dictionary<TKey, TVal> (테스트)를 사용할 수 있습니다 :

using (FileStream fileStream = new FileStream("test.binary", FileMode.Create)) 
{ 
    IFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
    bf.Serialize(fileStream, dict); 
} 
: 파일에

http://www.dacris.com/blog/2010/07/31/c-serializable-dictionary-a-working-example/

Dictionary<String, Object> otherDictionary = new Dictionary<String, Object>(); 
otherDictionary.Add("Foo", new List<String>() { "1st Foo","2nd Foo","3rd Foo" }); 
var dict = new SerializableDictionary<String, Object>(otherDictionary); 

쓰기를

파일에서 읽어 :

using (FileStream fileStream = new FileStream("test.binary", FileMode.Open)) 
{ 
    IFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
    dict = (SerializableDictionary<String, Object>)bf.Deserialize(fileStream); 
} 

참고 : 두 번째 Dictionary를 만들 필요가 없습니다 물론. 처음에는 SerializableDictionary을 사용할 수 있습니다. 그것은 단지 이미 존재하는 사전과 함께 사용하는 방법을 보여 주어야합니다.

0

XML로 직렬화하는 것은 어떻습니까?

http://support.microsoft.com/kb/815813

object yourType = new Object(); 

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(yourType.GetType()); 

x.Serialize(Console.Out,yourType); 
+0

작동 이음매가 없습니다. 런타임에 –

+1

중에 NotSupportedException을 던져서 유형의 항목이 serialize되지 않음을 의미합니다. 모든 하위 클래스도 직렬화가 가능해야합니다. – WraithNath

0

추가 종속성을 추가 할 필요가 없다면 protobuf.net을 사용할 수 있습니다. 이것은 XML serializer 접근법보다 빠르다는 장점이 있으며, 늪지 표준 사전 (Bog Standard Dictionary)에서 작동합니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Dictionary<int, string> dict = new Dictionary<int, string>(); 
     for (int i = 0; i < 10; i++) 
     { 
      dict[i] = i.ToString(); 
     } 

     using (var ms = new MemoryStream()) 
     { 
      ProtoBuf.Serializer.Serialize(ms, dict); 
      ms.Seek(0, SeekOrigin.Begin); 
      var dict2 = ProtoBuf.Serializer.Deserialize<Dictionary<int, string>>(ms); 
     } 
    } 
} 

너무 오래 사전의 키와 값 유형 모두 protobuf.net에 의해 직렬화으로,이 뜻 : 어셈블리에

참조는, 다음 쇼는 어떻게 MemoryStream와 함께 사용하기 작업.

편집 :

이 방법을 사용하려면, 당신은 ProtoBuf하여 키와 값 객체의 클래스가 직렬화해야한다. 간단히 말해서 [ProtoContract]을 클래스에 첨부하고 예를 들어 serialize하려는 각 속성에 [ProtoMember(1)]을 추가하십시오. 자세한 내용은 웹 사이트를 참조하십시오. stringint은 모두 상자에서 직렬화 할 수 있습니다.

+0

개체에 오류가 발생했습니다. 형식에 대해 정의 된 serializer가 없습니다. System.Object – Tomas

+0

@Tomas : protobuf serializer를 사용하고 있습니까? – markmuetz

+0

예, Protobuf는 Object를 serialize하는 방법을 모릅니다. – Tomas

관련 문제