Do części 1 chciałbym dodać jeszcze kilka modyfikacji i opisów. Mianowicie chciałbym zamiast listy dołożyć dodatkową klasę do Serializacji i deserializacji:
[Serializable()]
[XmlRoot("root")]
public class SerializeClass
{
public string Comment { get; set; }
public List<Person> PeopleList { get; set; }
public SerializeClass()
{
Comment = "This is Test List of People";
}
}
I teraz modyfikujemy klasę
PersonRepository - dodajemy pole
SerializeClass, która będzie wykorzystywana do zapisu oraz odczytu z pliku. Należy zwrócić uwagę na zmiany metod
SaveToXml() i
LoadFromXml() Oto kod zmodyfikowanej klasy:
public class PeopleRepository : IRepository
{
private string _assemblyDirectory;
private static int _peopleersonId;
public List<Person> PeopleList { get; set; }
private SerializeClass serializeClass;
private int SetNewId()
{
return ++_peopleersonId;
}
public void AddPerson(Person person)
{
if (PeopleList == null)
{
PeopleList = new List<Person>();
}
person.PersonId = SetNewId();
PeopleList.Add(person);
}
public PeopleRepository(string assemblyDirectory = @"d:/peoplelist.xml")
{
_assemblyDirectory = assemblyDirectory;
}
public void SaveToXml()
{
serializeClass = new SerializeClass();
serializeClass.PeopleList = this.PeopleList;
var xSerializer = new XmlSerializer(typeof(SerializeClass));
using (var writer = new StreamWriter(_assemblyDirectory))
{
xSerializer.Serialize(writer, serializeClass);
}
}
public void LoadFromXml()
{
var tmpXmlSerializer = new XmlSerializer(typeof(SerializeClass));
using (FileStream readFileStream = new FileStream(_assemblyDirectory, FileMode.Open, FileAccess.Read, FileShare.Read))
{
object obj = tmpXmlSerializer.Deserialize(readFileStream);
serializeClass = (SerializeClass)obj;
PeopleList = serializeClass.PeopleList;
}
}
}
W klasie Widoczne są atrybuty:
[Serializable()]
[XmlRoot("root")]
Pierwszy z nich określa, że obiekty tej klasy mogą być serializowane czyli zapisywane do XML'a. Drugi określa nazwę głównej gałęzi. W klasie Person określiłem atrybut:
Który zamienia z kolei atrybut w XML'u z elementu
<PersonId>1</PersonId> na <Person id="1">
Kolejny Atrybut zmienia nazwę elementu:
public class SerializePerson
{
[XmlElement("Number")]
public int HouseNo { get; set; }
[XmlElement("Street")]
public string StreetName { get; set; }
[XmlElement("CityName")]
}
Efekt jest następujący:
<AddressDetails>
<Number>4</Number>
<Street>Rohini</Street>
<CityName>Delhi</CityName>
</AddressDetails>
Kolejny
[XmlIgnore] powoduje wyrzucenie pola w klasie z procesu serializacji.
public class AddressDetails
{
[XmlElement("Number")]
public int HouseNo;
[XmlElement("Street")]
public string StreetName;
[XmlIgnore]
public string City;
}
Oto wynik kompilacji - pominięto w serializacji pole
City:
<AddressDetails>
<Number>4</Number>
<Street>ABC</Street>
</AddressDetails>
Brak komentarzy:
Prześlij komentarz