#protobuf-net
#protobuf-net
Вопрос:
Исключение InvalidOperationException генерируется protobuf.net 3.0.* при программном создании RuntimeTypeModel для класса, который наследуется от ClassB и имеет поле типа ClassB. Protobuf.net версия v2.4.6 не выдает в этом случае.
Этот минимальный пример, созданный в linqpad, показывает проблему. Код делает что-то не так? или есть проблема с protobuf.net 3.0 ?
class MyClass : AnotherClass
{
public MyClass(AnotherClass ac) => _mem1 = ac;
public AnotherClass _mem1;
}
class AnotherClass{}
RuntimeTypeModel MakeRTM( Type type)
{
var model = RuntimeTypeModel.Create();
MetaType metaTypeOuter = model.Add(type, true);
Type baseType = type.BaseType;
MetaType metaTypeInner = model.Add(baseType, true);
metaTypeInner.AddSubType(1, type);
int index = 0;
foreach( var fld in type.GetFields() )
{
// model.CanSerialize freezes both metaTypes, which causes the exception at "metaTypeOuter.Add"
if(!model.CanSerialize(fld.FieldType))
model.Add(fld.FieldType, true); // not called, as model.CanSerialize returned true
// throws invalidOperationException "The type cannot be changed once a serializer has been generated ..."
metaTypeOuter.Add( index, fld.Name);
}
return model;
}
void Main()
{
var mgt = new MyClass(new AnotherClass());
var rtmi = MakeRTM(mgt.GetType());
}
Комментарии:
1. Это интересный сценарий; он не предназначен для сбоя, нет; мне придется добавить его в свой список — это, вероятно, лучше, поскольку проблема с github
2. Привет, Марк, разве это не вызвало проблему с GitHub? Я его не вижу
3. Определенно, да
4. Привет, Марк, есть ли какие-либо новости об исправлении этой проблемы?
5. У меня просто не было времени; в конечном счете, это то, что я делаю в свободное время, и есть много конкурирующих требований для этого очень ограниченного времени