2016-05-01 2 views
-1

Я делаю приложение C#, которое требует, чтобы сериализовать данные Customer в XML-файл.C# возвратил свойства от объекта к XML

Так что я создал следующий класс, что я хочу, чтобы сериализовать позже:

public class Customer { 
    private string name{get; set;} 
    private int age{get; set;} 

    public void setCustomerAge(){ 
     age = 20; 
    } 

    public void setCustomerName(string input){ 
     name = input; 
    } 

    public string customerName(){ 
     return name; 
    } 

    public int customerAge(){ 
     return age; 
    } 

} 

Метод, который я пытался это создать новый клиент, установить его свойства и вызвать SerializeObject() на нем.

public void newCustomer(){ 
    Customer cust = new Customer(); 
    cust.setCustomerName("TEST"); 
    cust.setCustomerAge(); 
    SerializeObject(cust, savePath) 
} 

public void SerializeObject<T>(T serializableObject, string fileName) { 
    if(serializableObject == null) { 
     return; 
    } 

    try { 
     XmlDocument xmlDocument = new XmlDocument(); 
     XmlSerializer serializer = new XmlSerializer(serializableObject.GetType()); 
     using(MemoryStream stream = new MemoryStream()) { 
      serializer.Serialize(stream, serializableObject); 
      stream.Position = 0; 
      xmlDocument.Load(stream); 
      xmlDocument.Save(fileName); 
      stream.Close(); 
     } 

    } catch(Exception ex) { 
     Debug.WriteLine(ex); 
    } 
} 

Файл создается, но на выходе содержит следующие две строки только:

<?xml version="1.0"?> 
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

ли я приближается это от неправильного пути, и я должен использовать общий другой метод?

+0

Side Примечание: Я никогда не видел, чтобы кто создавать аксессоров в стиле Java для частная авто-собственность на C#. Вероятно, вы должны немного узнать о свойствах и о том, как они используются. – Chris

+0

@Fruchtzwerg Спасибо за ваш ответ, но я хочу, чтобы эти две переменные были приватными на porpuse. – Eyire

+0

Это прекрасно, но нет смысла создавать автоматические свойства с помощью {get; set;} вот так. Также соглашение должно использовать PascalCasing, а не camelCasing в C#! – Chris

ответ

0

От MSDN page for XmlSerializer.Serialize:

Метод Сериализация преобразует открытые поля и читать свойства/записи объекта в XML. Он не конвертирует методы, индексы, частные поля или свойства только для чтения. Чтобы сериализовать все поля и свойства объекта, как общедоступные, так и частные, используйте BinaryFormatter.

Таким образом, вам нужны либо публичные поля, либо общедоступные свойства, которые не читаются, и у вас их нет.

Я хотел бы предложить:

public class Customer 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

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

public class Customer 
{ 
    private string m_Name; 
    private int m_Age; 

    public string Name { get { return m_Name; } set { m_Name = value; } } 
    public int Age { get { return m_Age; } set { m_Age = value; } } 
} 
+0

Танк для вашего ответа. Я просто понял, что я ничего не знаю о xmlserializer. – Eyire

+0

@Eyire Отличное время для проверки документов! – Chris

0

Вы не можете сериализовать приватные свойства, подобные этому. Способ сделать это описан here. Чтобы решить вашу проблему, вы должны настроить свои свойства на публичные (необязательный частный набор).

public string name { get; private set; } 
public int age { get; private set; } 

Таким образом, ваше возвращение methodes как

public int customerAge(){ 
    return age; 
} 

не нужны. Ваш способ получить и установить свойство не очень распространен в C# (я думаю, что это похоже на Java). Смотрите here, чтобы посмотреть, как это сделать на C#.

+0

Так что мне необязательно устанавливать личные свойства и возвращать их таким образом? – Eyire

+0

Да, в примере кода вы можете читать, но не изменять значения извне. – Fruchtzwerg

0

Из MSDN:

Метод Сериализация преобразует открытые поля и чтения/записи свойства объекта в XML. Он не преобразует методы, шаговых, частные поля, или только для чтения свойства

У Вас нет ничего сериализовать, но сам объект.

0

Объект Xml.Serialization.XmlSerializer выполняет только мелкую сериализацию. Если вы также хотите сериализовать частные переменные объекта или дочерних объектов, вы должны использовать глубокую сериализацию. (https://support.microsoft.com/en-us/kb/815813)

Таким образом, мое предложение состояло бы в том, чтобы сделать объекты общедоступными.

В противном случае, вы могли бы проверить этот пост: Serializing private member data

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