2011-05-09 3 views
1

나는 테스트 콘솔 응용 프로그램을 가지고 있는데, serializaiton 및 deserialization을 사용하여 데이터를 XML 파일에 저장하려고합니다. serialize 메서드는 제대로 작동하지만 deserialization이 작동하지 않는 것 같습니다. 오류는 발생하지 않지만 .xml 파일에서 내 데이터를로드하지 않습니다. 왜 그런지 알아?C# 직렬화가 작동하지 않습니까?

class Program 
{ 
    static void Main(string[] args) 
    { 
     ArrayList siteList = new ArrayList(); 
     DeserializeArray(); 
     siteList.Add("Test 1"); 
     siteList.Add("Test 2"); 
     foreach (var item in siteList) 
     { 
      Console.WriteLine(item); 
     } 
     SerializeArray(siteList); 
     if (siteList.Contains("Test 2")) 
     { 
      Console.WriteLine("Test 2 exists!"); 
      Console.Read(); 
     } 
    } 

    public static void SerializeArray(ArrayList siteList) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(ArrayList)); 
     TextWriter textWriter = new StreamWriter("SiteList.xml"); 
     serializer.Serialize(textWriter, siteList); 
     textWriter.Close(); 
    } 

    static ArrayList DeserializeArray() 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(ArrayList)); 
     TextReader textReader = new StreamReader("SiteList.xml"); 
     ArrayList siteList; 
     siteList = (ArrayList)deserializer.Deserialize(textReader); 
     textReader.Close(); 

     return siteList; 
    } 
} 

} 그것은 (시험) 잘 작동하고

답변

1

, Main()의 논리가 꺼져 - 당신은 역 직렬화하기 전에 먼저 직렬화 할 필요가,이 시도 :

static void Main(string[] args) 
{ 

    ArrayList siteList = new ArrayList(); 

    siteList.Add("Test 1"); 
    siteList.Add("Test 2"); 
    foreach (var item in siteList) 
    { 
     Console.WriteLine(item); 
    } 
    SerializeArray(siteList); 
    siteList = DeserializeArray(); 
    if (siteList.Contains("Test 2")) 
    { 
     Console.WriteLine("Test 2 exists!"); 
     Console.Read(); 
    } 
} 
+0

이 경우 비 직렬화의 요점이 사라지지 않습니까? deserialization은 소스에서 데이터를 가져온다고 생각했습니다. 기존의 .xml 파일에 매번 새로운 .xml 파일을 추가하고 싶습니다. 그래서 처음에 역 직렬화하지 않아야합니까? – karlstackoverflow

+0

기존 XML에 yes를 추가하려면 먼저 deserialize 할 수 있지만 수행하지 않은 변수에 결과를 할당해야합니다 :'ArrayList siteList = DeserializeArray();' – BrokenGlass

+0

http : // stackoverflow .com/questions/5931484/c-deserializing-but-not-adding-before-xml – karlstackoverflow

1

코드는 여기에 잘 작동합니다. 먼저 deserialize하는 것처럼 이전 실행에서 SiteList.xml 있다고 가정합니다. Console.WriteLine을 추가하여 명확성을 위해 비 직렬화 된 데이터를 덤프했습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     ArrayList siteList = new ArrayList(); 
     ArrayList deserealizedArray = DeserializeArray(); 
     foreach (var item in deserealizedArray) 
     { 
      Console.WriteLine(item); 
     } 
     Console.WriteLine("---"); 
     siteList.Add("Test 1"); 
     siteList.Add("Test 2"); 
     foreach (var item in siteList) 
     { 
      Console.WriteLine(item); 
     } 
     SerializeArray(siteList); 
     if (siteList.Contains("Test 2")) 
     { 
      Console.WriteLine("Test 2 exists!"); 
      Console.Read(); 
     } 
    } 

    public static void SerializeArray(ArrayList siteList) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(ArrayList)); 
     TextWriter textWriter = new StreamWriter("SiteList.xml"); 
     serializer.Serialize(textWriter, siteList); 
     textWriter.Close(); 
    } 

    static ArrayList DeserializeArray() 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(ArrayList)); 
     TextReader textReader = new StreamReader("SiteList.xml"); 
     ArrayList siteList; 
     siteList = (ArrayList)deserializer.Deserialize(textReader); 
     textReader.Close(); 

     return siteList; 
    } 
} 
+0

이 코드는 SiteList.xml이 이미있는 경우에만 작동합니다. 그것을 수정할 수 있기 때문에 작동하지 않을 때 작동합니까? – karlstackoverflow

+0

Nevermind, try-catch를 구현했습니다. – karlstackoverflow

+0

이제는 새로운 데이터가 직렬화되면 새로운 arraylist에 추가되지 않습니다. 기존 목록을 새 데이터로 덮어 씁니까? 어떤 아이디어? – karlstackoverflow

관련 문제