Мы следующие классы и WCF сервис (с использованием Protobuf-сеть для сериализации):Protobuf-нетто члены не сериализации базового класса
[DataContract]
[KnownType(typeof(NamedViewModel))]
public class NamedViewModel<TKey> : IViewModel
{
[DataMember]
public virtual TKey Id { get; set; }
[DataMember]
public virtual string Name { get; set; }
}
[DataContract]
[KnownType(typeof(ScheduleTemplateViewModel))]
public class NamedViewModel : NamedViewModel<int>
{
}
[DataContract]
public class ScheduleTemplateViewModel : NamedViewModel
{
[DataMember]
public string Comment { get; set; }
}
[DataContract]
public class Container
{
[DataMember]
public IEnumerable<ScheduleTemplateViewModel> Templates { get; set; }
}
[ServiceContract]
public interface IService
{
[OperationContract]
Container Get();
}
public class Service : IService
{
public IEnumerable<Container> Get()
{
return new Container { Templates = Enumerable.Range(1, 10)
.Select(i => CreateTemplate()).ToArray() };
}
private void ScheduleTemplateViewModel CreateTemplate()
{
var instance = WindsorContainer.Resolve<ScheduleTemplateViewModel>();
// populate instance
return instance;
}
}
У нас есть две проблемы:
мы получаем исключение во время сериализации, что тип Castle DynamicProxy для ScheduleTemplateViewModel является неожиданным. Мы заметили, что в protobuf-net есть собственный код для обработки прокси-серверов NHibernate и EntityFramework ... но не Castle DynamicProxies. Мы работали над этим, добавив дополнительный аргумент case в исходном коде protobuf-net, чтобы проверить тип IProxyTargetAccessor для Castle ... но было бы неплохо, если бы был способ справиться с этим без изменения исходного кода protobuf-net ...
Члены в ScheduleTemplateViewModel (а именно, комментарий) сериализованы правильно ... но базовых классов не являются. У нас уже установлено значение InferTagFromNameDefault равным true в RuntimeTypeModel.Default.
Мы InferTagFromNameDefault установлен верно, именно поэтому нам не нужно Order = п информации. Это то, что делает это свойство, верно? Есть ли способ динамического/автоматического добавления ProtoInclude в RuntimeTypeModel во время выполнения? Это клиентское приложение, поэтому я не хочу подвергать себя хиту при запуске, чтобы добавить все в RuntimeTypeModel раньше времени ... То есть есть ли крючок или событие, которое я могу наблюдать как RuntimeTypeModel.Default.TypeAdded + = ... где я могу добавить код для добавления Include? Я не очень люблю помещать атрибуты BCL во все мои типы ... – Jeff
Полное имя интерфейса здесь http://internaltracker.googlecode.com/svn/trunk/Tracker/Castle.Core/DynamicProxy/IProxyTargetAccessor .cs – Jeff
@ JeffN825 моя ошибка за то, что вы не заметили «InferTagFromNameDefault». Иерархию можно управлять с помощью 'RuntimeTypeModel.Default [baseType] .AddSubType (...)' - но это о лучшем, что я могу предложить там –