代码之家  ›  专栏  ›  技术社区  ›  Paul Smith

protobuf net:反序列化guid属性的连线类型异常不正确

  •  1
  • Paul Smith  · 技术社区  · 15 年前

    我在使用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属性。(这是我对所有声明式序列化模型的主观问题;这是一个普遍存在的模式,我理解为什么会出现这种情况,但在我看来,如果我们能将一个人送上月球,那么“正常”应该是将对象和序列化合同分离开来。;(-))

    谢谢!

    1 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

    同意,你不需要明确的依赖关系- DataMember 很好。protobuf net使用相同的逻辑re ignore等。如何/在哪里存储数据?根据我的经验,最常见的原因是人们过度使用不同的数据编写缓冲区(或文件),而不是截断它(在流的末尾留下垃圾)。 as discussed here . 这与你的设想有关吗?