2012-03-16 4 views
0

Так что я чувствую себя как ноб, но это меня озадачило меня или часы, и хотя я прочитал много вопросов/учебников, я не могу получить эту работу. Без сомнения, это фундаментальная проблема, с которой я сталкиваюсь, настолько очевидной, что я полностью ее не понимаю. Во всяком случае, проблема у меня есть. У меня есть класс, который сериализуется именно так, как я хочу, например;Проблемы с сериализацией массивов

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Serialization; 
using System.Text; 

namespace SMCProcessMonitor 
{ 

public class Config 
{ 
    private string recipient = ""; 
    private int serverport; 
    private string username = ""; 
    private string password = ""; 

    public Config() 
    { 
    } 

    public string Recipient 
    { 
     get 
     { 
      return recipient; 
     } 
     set 
     { 
      recipient= value; 
     } 
    } 

За ним следуют gets/sets для разных переменных. Это прекрасно работает, но это следующий бит, с которым я борюсь. Поскольку они имеют дело с только одиночными экземплярами кода, это было относительно легко, но следующая часть я хотел бы добавить, список программ, по-видимому, выглядящий как

<program> 
    <programname>program1</programname> 
    <programfilepath>C:/...</programfilepath> 
</program> 
<program> 
<programname>program2</programname> 
<programfilepath>D:/...</programfilepath> 
</program> 

Я предполагаю, что здесь я хочу используйте массив для хранения различных программ при сериализации, из которых я, например, пробовал много разных способов, но не помог. Если я создаю следующий класс, чтобы держать мои детали массива, например:

public class Company 
{ 
    public programs[] Programs; 
} 
public class Programs 
{ 
    public string mFileName; 
    public string mFilePath; 
} 

Итак я пришел, чтобы использовать этот массив, чтобы заполнить данными, и вызвать его, используя следующее:

 SMCProcessMonitor.ConfigManager.mConfigurations.programs = sFile; 

левая сторона кажется прекрасной, но, пытаясь назначить ее переменной sFile (которая представляет собой строку, содержащую имя файла), я получаю несколько ошибок (в зависимости от того, что я пытаюсь, например sFile.ToArray и т. д., но именно таких ошибок преобразования as:

Невозможно неявно преобразовать тип 'string' в 'SMCProcessMon itor.Config.Programs [] '

так с этим длинным надутым вопросом спрашивали ... у кого есть какие-либо указатели или советы о том, где я ошибаюсь? как я сказал им уверен, что это что-то глупое, что им не удалось понять ..

Приветствия заранее, Шейн.

ответ

2

Массивы немного громоздки для использования в коллекциях с динамическим размером. Самый простой способ - это, вероятно, перейти к списку, сделав его похожим;

public class Company 
{ 
    public List<Program> Programs = new List<Program>(); 
} 
public class Program 
{ 
    public string FileName; 
    public string FilePath; 
} 

Добавление записи будет выглядеть примерно так:

Programs.Add(new Program { FileName = sFile, FilePath = sPath }); 

... и вы можете получить доступ к нему, используя ...

var theFirstProgram = Programs[0]; 
+1

Предполагая, что ваша строка программ является XML, вы можете взглянуть на linq на xml как быстрый способ проанализировать XML в своих программных объектах. http://weblogs.asp.net/brijmohan/archive/2008/11/22/linq-to-xml-and-linq-to-objects-basic-sample.aspx – rie819

0

Для каждой записи в массиве вам нужно будет добавить новую запись в программу, поэтому вам нужно будет создать программы и добавить к ней строки (mFilename, mFilePath), а затем добавить это в массив.

Вам также понадобится пространство для массива.

0

XmlArray атрибут?

Вы также можете использовать XMLAttribute, чтобы свойства добавлялись в ваши теги XML, которые более удобны для чтения и могут использоваться для хранения XML-файлов, которые необходимо легко редактировать.

Пример ...

public class Army 
{ 
    // Fields 
    private List<UnitCategory> _unitCategory; 
    private string _armyName; 

    // Properties 
    [XmlArray("unit-category")] 
    public List<UnitCategory> UnitCategory 
    { 
     get { return _unitCategory; } 
     set { _unitCategory = value; } 
    } 
} 
    [XmlAttribute("name")] 
    public string ArmyName 
    { 
     get { return _armyName; } 
     set { _armyName = value; } 
    } 
0

Вопрос заключается в том, что sFile является строка и вы пытаетесь назначить его массив.

Вы будете нуждаться, чтобы загрузить файл, представленный sFile первым, что-то вроде:

var fileStream = File.Open(sFile, FileMode.Open); 

Далее необходимо десериализовать содержимое файла в объект графа:

var xs = new XmlSerializer(typeof(Company)); 

// this will raise an error if the contents don't match the expected object type 
// else will return the Company object. 
var data = (Company)xs.Deserialize(fileStream); 

Затем вы сможете назначить десериализованный объект для вашей конфигурации:

SMCProcessMonitor.ConfigManager.mConfigurations.programs = data.Programs; 

1 n oте, я хотел бы сделать, так это то, что определение вашего класса для Company и Programs не будет десериализоваться должным образом на основе XML, который вы предоставили. Вам нужно будет использовать некоторые XmlAttributes, чтобы обеспечить правильные соответствия между элементами XML и графиком объектов.