Dzięki za odpowiedź.
Zastanawia mnie dostępność tych publicznych pól poza chwilami gdy zachodzi serializacja. Jeśli zawierają ważne informacje, które nie powinny być modyfikowane poza wyjątkowymi sytuacjami, to lepiej byłoby je pozostawić jako prywatne. Może konkretny przykład:
Mam klase Account
public class Account
{
private string _name;
private string _login;
private string _password;
// + jakieś właściwości i metody
}
Obiekty tej klasy powinny być modyfikowane tylko przy wczytaniu z pliku np. xml i przy pomocy edytora kont. Następnie są używane w trakcie działania programu gdzie średni czas życia takiego obiektu to ok 40 min - sporo czasu żeby publiczne pola mogły zostać zmodyfikowane, czy to przez przypadek, nieuwagę programisty, cokolwiek. Natomiast serializacja/deserializacja listy takich obiektów następuje sporadycznie. Nie lepiej jest wtedy mieć osobną klasę o takich samych polach tyle że publicznych przeznaczoną tylko do serializacji/deserializacji do pliku xml raz/dwa razy w ciągu działania programu? W tym wypadku zależy mi głównie na bezpieczeństwie i niezmienności danych w obiekcie. Oczywiście można by się uprzeć i zaimplementować ręcznie serializację nie przejmując się czy pole jest prywatne czy nie, ale gdy dostępne są gotowe narzędzia to po co się męczyć?
A co do serializacji list to mogę tak zrobić, ale wtedy nazwy elementów w pliku xml będą przyjmowały nazwę klasy obiektów serializowanych. Nie mogę wtedy też zmienić nazwy [XmlRoot] bo lista jest tworzona tuż przed serializacją i nie mam jak zdefiniować nazw elementów innych niż te występujące w CustomClass. Kawałek kodu:
public class CustomClass
{
[XmlAttribute]
public string Name { get; set; }
[XmlAttribute]
public string Login { get; set; }
[XmlAttribute]
public string Password { get; set; }
}
[XmlRoot("Root")]
public class ListSerializable
{
[XmlArray ("AccountList")]
[XmlArrayItem("Account")]
public List<CustomClass> AccountList { get; set; }
}
// i serializacja
XmlSerializer serializer = new XmlSerializer(typeof(ListSerializable));
using (StreamWriter writer = new StreamWriter(filePath))
{
serializer.Serialize(writer, listSerializable);
}
i plik wynikowy wygląda tak:
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AccountList>
<Account Name="nazwa" Login="login1" Password="haslo" />
</AccountList>
</Root>
Pytanie teraz takie: jak osiągnąć identyczny wynik bez korzystania z klasy ListSerializable a tylko z List<CustomClass> czli jak użyć atrybutów [XmlArray ("AccountList")] i [XmlArrayItem("Account")] poza klasą na samej liście.