protobuf.net v2.4.6 работает, V3.0.29 выдает «Тип не может быть изменен после создания сериализатора»

#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. У меня просто не было времени; в конечном счете, это то, что я делаю в свободное время, и есть много конкурирующих требований для этого очень ограниченного времени