sobota, 31 października 2015

XmlSerializer - Cz2. Serializacja, deserializacja - uzupełnienie

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:

[XmlAttribute("id")]

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>

Materiał został częściowo pobrany z CodeProject.





Brak komentarzy:

Prześlij komentarz