2016-05-01 7 views
-1

Ich mache eine C# -Anwendung, die erfordert, Kundendaten in eine XML-Datei zu serialisieren.C# hat Eigenschaften von einem Objekt an XML zurückgegeben

Also habe ich die folgende Klasse, was ich später serialisiert werden soll:

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; 
    } 

} 

Die Methode, die ich versucht habe, ist, einen neuen Kunden zu erstellen, stellen Sie Eigenschaften ist und rufen Sie die SerializeObject() auf sie.

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); 
    } 
} 

Die Datei wird erzeugt, aber die Ausgabe enthält diese beiden Zeilen nur:

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

Bin ich dies von einem falschen Weg nähern und sollte ich eine ganz andere Methode verwenden?

+0

Randbemerkung: Ich habe noch nie jemand Java-Stil Accessoren für ein gesehen erstellen private auto-property in C# gefällt das. Sie sollten wahrscheinlich ein wenig darüber nachdenken, welche Eigenschaften und wie sie verwendet werden. – Chris

+0

@Fruchtzwerg Vielen Dank für Ihre Antwort, aber ich möchte diese zwei Variablen privat auf porpuse behalten. – Eyire

+0

Das ist völlig in Ordnung, aber es hat keinen Sinn, sie mit {get; einstellen;} so. Auch die Konvention ist, PascalCasing nicht camelCasing in C# zu verwenden! – Chris

Antwort

0

Vom MSDN page for XmlSerializer.Serialize:

Die Serialize-Methode, die öffentlichen Felder konvertiert und Lese-/Schreib Eigenschaften eines Objekts in XML. Es werden keine Methoden, Indexer, private Felder oder schreibgeschützte Eigenschaften konvertiert. Verwenden Sie den BinaryFormatter, um alle Felder und Eigenschaften eines Objekts, sowohl öffentliche als auch private, zu serialisieren.

Sie benötigen also entweder öffentliche Felder oder öffentliche nicht schreibgeschützte Eigenschaften, von denen Sie keine haben.

Ich würde vorschlagen:

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

Oder wenn Sie später Logik in dem Setter brauchen werden:

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

Tank Sie für Ihre Antwort. Ich habe gerade festgestellt, dass ich grundsätzlich nichts über den xmlserializer weiß. – Eyire

+0

@Eyire Eine ausgezeichnete Zeit, um die Dokumente dann zu überprüfen! – Chris

0

Sie konnten private Eigenschaften wie diese nicht serialisieren. Ein Weg, dies zu tun, ist here beschrieben. Um Ihr Problem zu lösen, müssen Sie Ihre Eigenschaften auf public setzen (optional private set).

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

Auf diese Weise Ihre Rückkehr methodes wie

public int customerAge(){ 
    return age; 
} 

werden nicht mehr benötigt. Dein Weg, die Eigenschaft zu bekommen und zu setzen, ist in C# nicht sehr üblich (ich denke, das ist Java-ähnlich). Schauen Sie sich here an, um zu sehen, wie es in C# funktioniert.

+0

Also muss ich meine Eigenschaften nicht unbedingt auf privat setzen und sie so zurückgeben? – Eyire

+0

Ja, im Beispielcode können Sie die Werte von außen lesen, aber nicht ändern. – Fruchtzwerg

0

Von MSDN:

Die Serialize-Methode, die öffentlichen Felder konvertiert und Lesen/Schreiben Eigenschaften eines Objekts in XML. Es konvertiert nicht Methoden, Indexer, private Felder oder schreibgeschützte Eigenschaften

Sie haben nichts zu serialisiert, aber das Objekt selbst.

0

Das Objekt Xml.Serialization.XmlSerializer führt nur eine flache Serialisierung durch. Wenn Sie auch die privaten Variablen eines Objekts oder untergeordneter Objekte serialisieren möchten, müssen Sie die tiefe Serialisierung verwenden. (https://support.microsoft.com/en-us/kb/815813)

Also mein Vorschlag wäre, die Eigenschaften zu veröffentlichen.

Andernfalls könnten Sie diesen Beitrag überprüfen: Serializing private member data

Verwandte Themen