#.net #protobuf-net
#.net #protobuf-net
Вопрос:
public interface IYObject
{
string X { get; }
}
public class YObject : IYObject
{
public string X { get; set; }
}
public class D
{
public IYObject Y { get; set; }
}
class Program
{
static void Main()
{
var m = RuntimeTypeModel.Defau<
m.Add(typeof(D), true).Add("Y");
m.Add(typeof(IYObject), false).AddSubType(1, typeof(YObject)).Add("X");
var d = new D { Y = new YObject { X = "a" } };
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, d);
ms.Position = 0;
var d2 = Serializer.Deserialize<D>(ms);
Debug.Assert(d.Y.X == d2.Y.X);
}
}
}
При попытке добавить подтип в IYObject
происходит сбой кода:
System.InvalidOperationException occurred
Message=Sub-types can only be adedd to non-sealed classes
Source=protobuf-net
StackTrace:
at ProtoBuf.Meta.MetaType.AddSubType(Int32 fieldNumber, Type derivedType)
InnerException:
Комментарии:
1. «Подтипы могут быть добавлены только к незапечатанным классам» — это не класс, поэтому он, безусловно, не является незапечатанным классом. Я постараюсь повысить это ограничение в соответствии с вашим (и существующими) запросами. Но сначала …. сон.
2. Вы действительно даете мне отработку; p Я приветствую это — вы вынуждаете меня добавить много блеска в областях, которые люди запрашивали начиная с версии v1. Весь смысл новой модели типа v2 заключался в том, чтобы сделать возможным такого рода гибкость (судя по вашему сколь угодно большому количеству сообщений), и пока я очень доволен, что необходимая универсальность присутствует в новой модели (т. Е. Ничто особо не сдерживало демонстрацию).
Ответ №1:
Примерно 2 минуты назад это было незаконно, потому что известные типы не поддерживались в интерфейсах.
Теперь это использование незаконно, потому что оно не может безопасно сериализоваться, IYObject.X
поскольку у него нет установщика. Однако, пока мы ограничиваемся элементами интерфейсов, которые могут быть разумно сериализованы, или элементами конкретного типа, это теперь зафиксировано. Используя либо атрибуты, либо модель типа. Смотрите здесь сценарии, которые теперь доступны (либо через код, либо через следующее общедоступное удаление).
Комментарии:
1. Что означает логический аргумент в RuntimeTypeModel. Добавить метод?
2. @Mark
<param name="applyDefaultBehaviour">Whether to apply the inbuilt patterns, or jut add the type with no additional configuration.</param>
— или короче (и я уточню документацию) — если значение равно false, никакие атрибуты не обрабатываются — вы должны полностью настроить тип вручную