Есть ли способ исправить эту ошибку во время выполнения при использовании Protobuf-net и наследования? - PullRequest
1 голос
/ 12 февраля 2011

Хорошо, у меня есть следующий код, который работал, но теперь это не так.Единственное, что изменилось, теперь я использую VS2010 и .NET4

[ProtoContract]
[ProtoInclude(1, typeof(DerivedClass))]
public abstract class BaseClass
{
    [ProtoMember(2)]
    protected virtual string MyString { get; set; }
}

[ProtoContract]
public class DerivedClass : BaseClass
{
    [ProtoMember (2)]
    public readonly int SomeInt = 10;

    protected override string MyString
    {
        get { return "dummy"; }
        set { base.MyString = value; }
    }
}

[Test]
public void Test()
{
    var derived = new DerivedClass();


    using (Stream s = new MemoryStream ())
        Serializer.Serialize(s, derived);   // InvalidOperationException: Duplicate tag 2 detected in SomeInt
}

Есть ли что-то, чего мне здесь не хватает?

Я вижу, что PB раздражает тот же номер тегадля обоих классов, когда я переопределяю родительское свойство, которое использует тот же номер тега, но я думал, что это будет изолировано ...

1 Ответ

1 голос
/ 12 февраля 2011

Мне придется исследовать - предположительно, некоторые нюансы атрибутов и переопределений - я не знаю конкретных изменений, но это ... неожиданно.

В качестве пробной версии вы можете добавить [ProtoIgnore] на override string MyString - но, пожалуйста, убедитесь, что он все еще сериализует его (из базового типа)!

то есть

[ProtoIgnore]
protected override string MyString
{
    get { return "dummy"; }
    set { base.MyString = value; }
}

Для информации, я проверил ваш код против v2и он отлично работал в VS2010, ориентируясь на .NET 4.0;У меня нет v1 под рукой на этой машине ...

...