Можно ли сериализовать в xml свойство (в сериализованном классе xml), которое возвращает список строковых объектов?

1

У меня есть класс, позвольте ему позвонить, Employee, у которого есть список квалификаций как свойство

[XmlRoot("Employee")]
public class Employee
{
    private string name;
    private IListManager<string> qualification = new ListManager<string>();

    public Employee()
    {
    }

    [XmlElement("Name")]
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            if (value != null)
            {
                name = value;
            }
        }
    }

    public ListManager<string> QualificationList
    {
        get
        {
            return qualification as ListManager<string>;
        }
    }

    [XmlElement("Qual")]  
    public string Qualifications
    {
        get
        {
            return ReturnQualifications();
        }
    }

    private string ReturnQualifications()
    {
        string qual = string.Empty;
        for (int i = 0; i < qualification.Count; i++)
        {
            qual += " " + qualification.GetElement(i);
        }
        return qual;
    }

    public override String ToString()
    {
        String infFormat = String.Format("{0, 1} {1, 15}", this.name, Qualifications);
        return infFormat;
    }
}

}

Тогда у меня есть метод, который сериализует вышеупомянутый класс tom XML, взяв список Employees в качестве patameter, метод является общим:

public static void Serialize<T>(string path, T typeOf)
        {
            XmlSerializer xmlSer = new XmlSerializer(typeof(T));
            TextWriter t = new StreamWriter(path);
            try
            {
                xmlSer.Serialize(t, typeOf);
            }
            catch
            {
                throw;
            }
            finally
            {
                if (t != null)
                {
                    t.Close();
                }
            }
        }

Так я называю метод XMLSerialize:

controller.XMLSerialize<Employee>(opnXMLFileDialog.FileName, employeeList);

Результат выполнения метода возвращает файл и показан ниже:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfEmployees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Employees>
    <Name>g</Name>
  </Employees>
</ArrayOfEmployees>

как вы можете видеть, есть только имя свойства, включенное в файл. Как я исхожу отсюда и сериализую список квалификаций? Любые предложения будут высоко оценены. Заранее спасибо.

  • 0
    Это может быть связано: stackoverflow.com/questions/13401192/…
  • 0
    Хотели бы вы уточнить, почему вы находите этот пост связанным с моим? Вы имеете в виду, что причина, по которой мое свойство не сериализовано, в том, что у меня нет сеттера? Даже если бы это было так, мне все равно нужно десериализовать файл. Спасибо за ваш вклад.
Показать ещё 1 комментарий
Теги:
serialization

1 ответ

1
Лучший ответ

Чтобы сериализовать свойство, XmlSerializer требует, чтобы свойство имело как публичный сеттер, так и публичный получатель. Поэтому любое свойство, которое вы выбираете для сериализации ваших квалификаций, должно иметь сеттер, а также геттер.

Очевидным решением было бы для вашего QualificationList иметь сеттер, а также getter:

public ListManager<string> QualificationList
{
    get
    {
        return qualification as ListManager<string>;
    }
    set
    {
        qualification = value;
    }  
}

Если по какой-то причине это невозможно сделать - возможно, потому, что ListManager<string> не является сериализуемым - вы можете сериализовать и десериализовать его как прокси-массив строк, например:

    [XmlIgnore]
    public ListManager<string> QualificationList
    {
        get
        {
            return qualification as ListManager<string>;
        }
    }

    [XmlElement("Qual")]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    public string[] QualificationArray
    {
        get
        {
            return Enumerable.Range(0, qualification.Count).Select(i => qualification.GetElement(i)).ToArray();
        }
        set
        {
            // Here I am assuming your ListManager<string> class has Clear() and Add() methods.
            qualification.Clear();
            if (value != null)
                foreach (var str in value)
                {
                    qualification.Add(str);
                }
        }
    }

Затем для следующего списка сотрудников:

        var employee = new Employee() { Name = "Mnemonics" };
        employee.QualificationList.Add("posts on stackoverflow");
        employee.QualificationList.Add("easy to remember");
        employee.QualificationList.Add("hard to spell");

        var list = new List<Employee>();
        list.Add(employee);

Создается следующий XML:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfEmployee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Employee>
        <Name>Mnemonics</Name>
        <Qual>posts on stackoverflow</Qual>
        <Qual>easy to remember</Qual>
        <Qual>hard to spell</Qual>
    </Employee>
</ArrayOfEmployee>

Это удовлетворительно?

  • 1
    Мне очень жаль за поздний ответ. Да, хотя, по соображениям безопасности, я не могу создать публичную собственность из списка. Например, другие разработчики не должны иметь доступа к списку, заполненному учетными данными пользователей. Но вы отвечаете очень удовлетворительно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню