【问题标题】:Protobuf (de)serializationProtobuf(反)序列化
【发布时间】:2014-10-20 16:11:02
【问题描述】:

我有这样的课程设置(我删除了很多其他属性,因为它们与我的问题无关......):

public class Record : IRecord
{
    /// <summary>
    /// The type of recovery record and data needed to recover this record.
    /// </summary>
    [DataMember(Order = 1)]
    public IRecord Entry { get; private set; }

    [IgnoreDataMember]
    public object Entry
    {
        get { return Entry; }
    }
}

[ProtoContract
    , ProtoInclude(2, typeof(CaseRecord))
    , ProtoInclude(3, typeof(UserRecord))
]
public interface IRecord: IEntry
{
}

public interface IEntry
{
    long EntryId { get; set; }
    long DataSourceId { get; set; }
}

public class UserRecord : RecordEntry<UserRecord> 
{
    // ...other datamembers...

    [IgnoreDataMember]
    public override long EntryId { get; set; }
    [IgnoreDataMember]
    public override long DataSourceId { get; set; } 
}

[DataContract]
public abstract class RecordEntry<T> : RType<T>, IRecord
    where T : RType<T>, new()
{
    // other datamembers...
    public abstract long EntryId { get; set; }
    public abstract long DataSourceId { get; set; }
}

我像这样(反)序列化记录流:

Serializer.SerializeWithLengthPrefix(_stream, record, PrefixStyle.Base128);

Serializer.DeserializeWithLengthPrefix&lt;Record&gt;(_stream, PrefixStyle.Base128);

当我尝试反序列化时,我的Record 对象(类型为UserRecord)为EntryIdDataSourceId 返回值0,我不完全确定为什么。我从EntryDataSource id 中删除了[IgnoreDataMember],但在反序列化时我的值仍然为0。对象的所有其他属性均已正确填充。

用户记录是在我的[TestMethod]...中创建的...

userRecord1 = new UserRecord()
{
    // ...other datamembers
    EntryId = 123456789,
    DataSourceId = 123456789,
};

【问题讨论】:

    标签: c# serialization protobuf-net


    【解决方案1】:

    http://thwadi.blogspot.com/2013/07/using-protobuff-net-with-inheritance.html

    找到上述文章并将ProtoMember属性添加到EntryIdDataSourceId,我能够得到正确的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多