C # XML сериализация последовательного идентификатора

#xml #serialization #c#-4.0

#xml #сериализация #c#-4.0

Вопрос:

У меня есть класс C #, который должен быть сериализован как XML. Один из подузлов имеет идентификатор последовательности, который увеличивается. Работает следующий код.

 public class PlansSummary
{
    public int Id { get; set; }

    public List<Plan> Plans { get; set; } = new List<Plan>();

    public string ToXml()
    {
        var serializer = new XmlSerializer(this.GetType());
        using (var stringXml = new StringWriter())
        {
            serializer.Serialize(stringXml, this);
            return stringXml.ToString();
        }
    }
}

public class Plan
{
    private static int _sequenceCount = 1;

    public Plan()
    {
        _sequenceCount  ;
    }

    //// In this property, 'set' must exist and be public for XmlSerializer to work
    public int sequence { get; set; } = _sequenceCount;
    public DateTime planStartDate { get; set; }
    public DateTime planEndDate { get; set; }
}
  

Но ничто не мешает следующему разработчику использовать мой класс и использовать параметр set в свойстве sequence. Я не могу сделать последовательность закрытой или доступной только для чтения, потому что это остановит отображение последовательности в XML. Есть ли решение для этого?

Ответ №1:

Работает ли это, если вы реализуете пустой установщик?

 public class Plan
{
    private static int _sequenceCount = 0;
    private int _sequenceReturn = 0;

    public Plan()
    {
        _sequenceCount  ;
        _sequenceReturn = _sequenceCount;
    }

    public int sequence
    {
        get
        {
            return _sequenceReturn;
        }
        set { }
    }

    public DateTime planStartDate { get; set; }
    public DateTime planEndDate { get; set; }
}
  

Комментарии:

1. Нет, фактически это делает что-то неожиданное. Если у меня есть четыре объекта плана в моем списке планов, то порядковый номер равен 5 для всех четырех из них.

2. Я обновил кодовый блок — если вы реализуете переменную экземпляра (в данном случае _sequenceReturn) вместе с пустым параметром установки, вы должны обнаружить, что последовательность работает так, как изначально предполагалось.