2010-11-09 4 views
1

Я установил сериализацию/десериализацию xml для сохранения данных в моем приложении. Я могу десериализовать элементы без массива, но когда я десериализую массив, он пуст. У меня есть подозрение, что проблема заключается в заданной части свойства im, пытающейся сериализовать/десериализовать.C#: Как получить доступ к данным из десериализованного xml-файла

Первый класс я пытаюсь сериализации:

namespace kineticMold 
{ 
    [Serializable()] 
    public class Config 
    { 
     public Config() { } 
     public string ComPort 
     { 
      get 
      { 
       return comPort; 
      } 
      set 
      { 
       comPort = value; 
      } 
     } 

     [XmlArrayItem("recentFile")] 
     public string[] LastOpen 
     { 

      get 
      { 
       return lastOpen; 
      } 
      set 
      { 

        ArrayList holderList = new ArrayList(); 

        holderList.Add(value); 

        for (int i = 0; i < 4; i++) 
        { 

         holderList.Add(lastOpen[i]); 

        } 

        lastOpen = (string[])lastOpen.ToArray<string>(); 



      } 
     } 

     private string comPort; 
     private string[] lastOpen = new string[5]; 


    } 
} 

Результат сериализации:

<?xml version="1.0" encoding="utf-8" ?> 
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ComPort>COM12</ComPort> 
    <LastOpen> 
     <recentFile>test.xml</recentFile> 
     <recentFile xsi:nil="true" /> 
     <recentFile xsi:nil="true" /> 
     <recentFile xsi:nil="true" /> 
     <recentFile xsi:nil="true" /> 
    </LastOpen> 
</Config> 

Код для десериализации:

_cf = new Config(); 
      XmlSerializer ser = new XmlSerializer(typeof(Config)); 

      if (File.Exists(settings_filepath)) 
      { 
       FileStream fs = new FileStream(@settings_filepath, FileMode.Open); 
       _cf = (Config)ser.Deserialize(fs); 
       fs.Close(); 
      } 

Код для чтения десериализованное данные:

for (int i = 0; i < _cf.LastOpen.Length; i++) 
      { 

       if (_cf.LastOpen[i] != null) 
       { 
        toolStripMenuItem1.DropDownItems.Add(_cf.LastOpen[i]); 

        recentState = true; 
       } 
      } 
+0

Пытались вы используете * List * вместо этого? – Stormenet

+0

@Sotmenet - списки лучше подходят для сериализации? Еще не пробовал. Пробовал аррайиста, но это с треском провалилось. – Bildsoe

+0

Нет, это не имеет никакого значения, но оно может быть более удобным для вас как пользователя. – leppie

ответ

1

У вас есть:

lastOpen = (string[])lastOpen.ToArray<string>(); 

ли вы имеете в виду holderList здесь (на правой стороне)?

Это не полностью очистить данные, которые вы хотите, но в настоящее время вы не храните ни один из предметов от value вне сеттера. Кроме того, ArrayList здесь в значительной степени избыточен; это может быть List<string> возможно?

Конечно, еще проще:

private readonly List<string> lastOpen = new List<string>(); 
[XmlArrayItem("recentFile")] 
public List<string> LastOpen {get {return lastOpen;}} 

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

+0

Привет, Марк. Я изменил свой код, все еще используя Array, но позволяя вызывающему коду беспокоиться о том, сколько предметов нужно хранить, и при необходимости изменять содержимое, когда это было сделано, спасибо. – Bildsoe

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