Я использую DataContract
для сериализации/десериализации объектов на машине пользователя. Таким образом, в основном сценарий сохранения/загрузки.Внедрение сопоставления между различными типами (bool? И enum) с использованием DataContract
У меня есть DataContract
, которая была упорядоченная DataMember
типа bool?
и теперь мне нужно изменить его на Enum
. Он заказан, потому что один из сериализаторов - protobuf-net.
Как это выглядит сейчас:
[DataContract]
public class Result
{
[DataMember(Order = 3)]
public bool? Accepted { get; set; }
}
Это должно быть:
public enum ResultDecisionStatus
{
Accepted, //// map as 'true' for 'bool?'
Rejected, //// map as 'false' for 'bool?'
Neutral, //// new
Unknown //// map as 'null' for 'bool?'
}
[DataContract]
public class Result
{
[DataMember(Order = 4?)] //// I assume ordering might have to change
public ResultDecisionStatus DecisionStatus { get; set; }
}
я реализовал следующие, мне кажется, чтобы быть Hacky, но, кажется, работает. Я оставил Accepted
в том же заказе и изменил его на private
и установил переменную, чтобы сопоставить ее с новым Enum
при десериализации. Это хороший дизайн? Это странно.
[DataContract]
public class Result
{
[DataMember(Order = 4)]
public ResultDecisionStatus DecisionStatus { get; set; }
[DataMember(Order = 3)]
private bool? Accepted { get; set; }
[DataMember(Order = 1003)]
private bool AcceptedToDecisionStatusMapped { get; set; }
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
if (!AcceptedToDecisionStatusMapped)
{
switch(Accepted)
{
case true:
DecisionStatus = ResultDecisionStatus.Accepted;
break;
case false:
DecisionStatus = ResultDecisionStatus.Rejected;
break;
case null:
DecisionStatus = ResultDecisionStatus.Unknown;
break;
}
AcceptedToDecisionStatusMapped = true;
}
}
}
Вопрос: Есть ли надлежащим образом реализовать отображение между типами для упорядоченного DataContracts
без сохранения старых членов и добавление дополнительных свойств отображения для каждой версии?
О, аккуратно, что избавляется от отображаемой переменной. Вероятно, нет способа избавиться от «Принято»? – Vlad
Да, не без взлома B/C. – Jacob
См. Мой другой ответ; это должно быть лучшим способом, если он работает, и он не вводит никаких новых полей. – Jacob