我在使用protobuf net反序列化orm生成的实体的某些guid属性时遇到问题。
下面是一个简化的代码示例(复制了场景的大多数元素,但不复制行为;我不能公开我们的内部实体,因此我正在寻找解释异常的线索)。假设我有课,
Account
用一个
AccountID
只读guid和
AccountName
读写字符串。我立即序列化克隆。
反序列化抛出
Incorrect wire-type deserializing Guid
反序列化时出现异常。
下面是使用示例…
Account acct = new Account() { AccountName = "Bob's Checking" };
Debug.WriteLine(acct.AccountID.ToString());
using (MemoryStream ms = new MemoryStream())
{
ProtoBuf.Serializer.Serialize<Account>(ms, acct);
Debug.WriteLine(Encoding.UTF8.GetString(ms.GetBuffer()));
ms.Position = 0;
Account clone = ProtoBuf.Serializer.Deserialize<Account>(ms);
Debug.WriteLine(clone.AccountID.ToString());
}
这里有一个orm类的例子(简化了,但是演示了我能想到的相关语义)。使用shell游戏通过公开backing字段来反序列化只读属性(“can t't write”本质上变为“should't write”,但我们可以扫描代码以查找分配给这些字段的实例,因此黑客可以为我们的目的工作)。
再说一遍,这是
不
再现异常行为;我正在寻找关于
能够
:
[DataContract()]
[Serializable()]
public partial class Account
{
public Account()
{
_accountID = Guid.NewGuid();
}
[XmlAttribute("AccountID")]
[DataMember(Name = "AccountID", Order = 1)]
public Guid _accountID;
/// <summary>
/// A read-only property; XML, JSON and DataContract serializers all seem
/// to correctly recognize the public backing field when deserializing:
/// </summary>
[IgnoreDataMember]
[XmlIgnore]
public Guid AccountID
{
get { return this._accountID; }
}
[IgnoreDataMember]
protected string _accountName;
[DataMember(Name = "AccountName", Order = 2)]
[XmlAttribute]
public string AccountName
{
get { return this._accountName; }
set { this._accountName = value; }
}
}
xml、json和datacontract序列化器似乎都可以很好地序列化/反序列化这些对象图,因此属性排列基本上可以工作。我试过protobuf网络的列表与单实例,不同的前缀样式等,但仍然总是得到'不正确的电线类型…反序列化时出现guid异常。
所以具体的问题是,对此有什么已知的解释/解决方法吗?我不知道是什么情况(在实际的代码中,而不是示例中)导致的。
我们
希望
不必直接在实体层中创建protobuf依赖项;如果是这样,我们可能会创建代理dto实体,其中所有公共属性都具有protobuf属性。(这是我对所有声明式序列化模型的主观问题;这是一个普遍存在的模式,我理解为什么会出现这种情况,但在我看来,如果我们能将一个人送上月球,那么“正常”应该是将对象和序列化合同分离开来。;(-))
谢谢!