【发布时间】:2011-05-19 18:34:28
【问题描述】:
我们知道 Silverlight 不允许私有反射。不过,我有一个带有私有设置器的公共属性,我需要能够对其进行序列化(这里没问题)和反序列化(很糟糕)。
我知道世界上没有任何东西可以让 protobuf-net 在 Silverlight 中写入该属性,这必须在客户端类型(或程序集,如果该属性是内部的)中完成。
在 Silverlight 的 protobuf-net 中是否有一个计划,这使得它成为可能?我可以让该类型实现一些专门的 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 平台,其他平台只会调用私有 setter。
你怎么看?
EDIT2
我想指出,当然仍然可以获得对任意 PropValue
EDIT3
可以使 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);
}
}
相当多的努力都是偶然发生的。至于故意滥用 - 这里没有回归。人们总是可以序列化一个对象,操作二进制序列化数据,然后将其反序列化。回归只是在易于滥用。但是,我的目标是:
- 防止意外出错
- 保持 setter 不公开
- 避免与代理相关的维护噩梦。
【问题讨论】:
-
我仍在阅读编辑内容,但重新考虑了反射/绑定 API - 只需添加
[ReadOnly(true)](msdn.microsoft.com/en-us/library/…) -
我还没有尝试过代码,但我想知道是否只有一个 method(而不是属性)来设置值可以让我们充分地到达那里。即
[Obsolete("Use this and I kill you")] public void SetProp(string value) {...}(也许还有一些东西告诉 protobuf-net 使用这种方法,但它也可以是基于模式的) -
当然,我同意。我只想要一个阴影设置器方法。
-
@mark 酷;我可以做到 :) 我担心的是我已经非常努力允许使用不想了解 protobuf 详细信息的类型(朴素的 POCO 等) - 所以制作 protobuf 类型的一部分API 是不可取的。如果您对采用字符串的方法感到满意,那几乎没有任何工作。给我几天? (管道中的其他东西等)
-
使用 ObsoleteAttribute 时,还可以使用带布尔值的重载。当这个bool为真时,使用该方法时会出现编译错误。我在应仅由序列化程序使用的无参数构造函数上使用 [Obsolete("only for serialization", true)]。
标签: protobuf-net