Как мы знаем, Silverlight не допускает частного отражения.Тем не менее, у меня есть открытое свойство с частным установщиком, которое мне нужно иметь для сериализации (здесь нет проблем) и десериализации (облом).
Я знаю, что ничто в мире не заставит писать protobuf-netс этим свойством в Silverlight это должно быть сделано изнутри типа клиента (или сборки, если свойство сделано внутренним).
Существует ли схема в protobuf-net для Silverlight, которая делает это возможным?Я мог бы заставить тип реализовать некоторый специализированный интерфейс protobuf-net (например, IProtoSerializable).
Спасибо.
РЕДАКТИРОВАТЬ
Я могу предложитьсхема, подобная этой:
[ProtoMember(N, SetterMethod = "DeserializePropValue")]
public string property Prop
{
get { return m_prop; }
private set { m_prop = value; }
}
public void DeserializePropValue(ProtoValue<string> value)
{
m_prop = value.Value;
}
Где тип ProtoValue является открытым, но его конструкторы являются внутренними, так что только сборка protobuf-net может создавать экземпляры этого типа.И, конечно, protobuf-net не будет предоставлять какой-либо общедоступный API для создания объектов ProtoValue.
Эта схема может поддерживаться только для платформы Silverlight, другие платформы просто вызывают частный установщик.
ЧтоКак вы думаете?
EDIT2
Хочу заметить, что, безусловно, можно получить ссылку на произвольный экземпляр PropValue , но это не будет случайнои это случайные перезаписи имущества, которые я хочу устранить.Кроме того, я хочу, чтобы сеттер не был общедоступным, чтобы он не появлялся в различных механизмах связывания на основе отражений, используемых в пользовательском интерфейсе.
EDIT3
PropValue экземпляры могут быть сделаны непригодными для хранения, то есть после возврата метода DeserializePropValue соответствующий экземпляр PropValue становится недействительным.Это оставляет только один способ злоупотребить им, например:
[ProtoContract]
public class Abusee
{
[ProtoMember(1, SetterMethod = "DeserializePropValue")]
public string property Prop { get; private set; }
public void DeserializePropValue(ProtoValue<string> value)
{
m_prop = value.Value;
}
}
[ProtoContract]
public class Abuser
{
private Abusee m_abusee;
public Abuser(Abusee abusee, string newPropValue)
{
m_abusee = abusee;
Dummy = newPropValue;
Serializer.DeepClone(this);
}
[ProtoMember(1, SetterMethod = "DeserializeDummyValue")]
public string property Dummy
{
get;
private set;
}
public void DeserializeDummyValue(ProtoValue<string> value)
{
m_abusee.DeserializePropValue(value);
}
}
Довольно много усилий может произойти случайно.Что касается преднамеренного насилия - здесь нет регресса.Всегда можно сериализовать объект, манипулировать двоичными данными сериализации и затем десериализовать его обратно.Регресс только в простоте злоупотребления.Однако моя цель состоит в том, чтобы:
- Предотвращать ошибки случайно
- Держать сеттер закрытым
- Избегать кошмара обслуживания, связанного с суррогатами.