Честно говоря, это звучит как ошибка в protobuf- net, из-за которой вы должны войти на GitHub, в идеале с репро , в котором также отображается контракт на обслуживание (интерфейс).
типы должны выглядеть разумно. Несоответствие длины в конце особенно тревожно, но я не верю, что это имеет какое-либо отношение к обсуждению типов динамических c.
Рад помочь разобраться в этом вопросе (я автор), но: это больше похоже на GitHub.
Я подозреваю , что разница в длине связана с тем, что Data
не является протоконтрактом (поэтому сомнительно, что соблюдается; это подкрепляется переменной var, что в противном случае были бы повторяющиеся поля 1), но правильное воспроизведение действительно поможет.
изменения в вашем коде заключаются в том, чтобы убедиться, что Data
помечено как ProtoContract
, использовать другой номер для «включаемой» части и добавить метод Create
к PersonDataItem
для использования тестовой оснастки; Трудно понять, какая часть проблемы связана с этим без репродукции.
using ProtoBuf;
using ProtoBuf.Meta;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
[DataContract]
public class Response<TValue>
{
[DataMember(Order = 1)]
public TValue Value;
}
[DataContract]
public class PersonData : Data
{
[DataMember(Order = 1)]
public IList<PersonDataItem> PersonDataList;
}
[DataContract]
public class PersonDataItem
{
public static PersonDataItem Create(PersonDataType type, DateTime? time)
=> new PersonDataItem { Type = type, Time = time };
[DataMember(Order = 1)]
public PersonDataType Type { get; private set; }
[DataMember(Order = 2)]
public DateTime? Time { get; private set; }
[DataContract]
public enum PersonDataType : int
{
[EnumMember]
Child = 1,
[EnumMember]
Adult = 2
}
}
[ProtoContract, DataContract]
[ProtoInclude(10, typeof(PersonData))]
public class Data
{
[ProtoMember(1), DataMember(Order = 1)]
public string Name;
}
static class P
{
static void Main()
{
var resp = new Response<PersonData>
{
Value = new PersonData
{
Name = "abc",
PersonDataList = new List<PersonDataItem>
{
PersonDataItem.Create(PersonDataItem.PersonDataType.Adult, DateTime.Now),
}
}
};
var clone = RoundTrip(resp);
Console.WriteLine(clone.Value.Name);
var item = clone.Value.PersonDataList.Single();
Console.WriteLine(item.Time);
Console.WriteLine(item.Type);
}
static T RoundTrip<T>(T value)
{
var model = RuntimeTypeModel.Default;
using var state = model.Measure<T>(value);
using var ms = new MemoryStream();
state.Serialize(ms); // we expect this to explode if there was a length mismatch
ms.Position = 0;
return model.Deserialize<T>(ms);
}
}