Protobuf.net «Тип не может быть изменен после создания сериализатора» - PullRequest
2 голосов
/ 24 октября 2010

У меня есть довольно простой код, использующий Protobuf.net, который выдает очень странное исключение.В MetaType.cs в строке 167 он генерирует исключение InvalidOperationException «Тип не может быть изменен после генерации сериализатора».Что это значит и как я могу это исправить?

Мой код выглядит так:

Этот метод запускает всю сериализацию:

while (!Parallel.For(0, 100, (i) =>
{
    Widget w;
    lock (f) { w = f.CreateWidget(); }

    SerialiseWidget(w);

}).IsCompleted)
{
    Thread.Sleep(10);
}

Довольно просто, этопросто проходит через все параллельно и сериализует 100 виджетов.

Метод serialise также довольно прост:

private byte[] SerialiseWidget(Widget w)
{
    using (MemoryStream m = new MemoryStream())
    {
        Serializer.Serialize<PacketChunk>(m, w);

        return m.ToArray();
    }
}

И, наконец, класс виджета выглядит следующим образом:

[ProtoContract]
private class Widget
{
    [ProtoMember(1)]
    public int a;

    [ProtoMember(2)]
    public byte[] b;

    [ProtoMember(3)]
    public Thing c; //Thing is itself a protocontract

    [ProtoMember(4)]
    public int d;

    [ProtoMember(5)]
    public int e;
}

Edit :: Я подозреваю, что это может быть связано с тем, что я зацикливаюсь параллельно.Насколько безопасен Protobuf.net для такого рода вещей?

1 Ответ

4 голосов
/ 24 октября 2010

Насколько потокобезопасен Protobuf.net для такого рода вещей?

Ну, он заметил что-то странное:)

Просто добавьте вызов в Serializer.PrepareSerializer в какой-то момент перед тем, как начать продвижение (запуск приложения является очевидным моментом), и он должен простить вас

Редактировать: если подумать, я могу сделать довольно простое изменение, чтобы помочь этому конкретному сценарию; Я настрою это, когда у меня будет шанс. Кроме того, это должно влиять только на невыпущенный код "v2" (из кода sorce) - этот AFAIK не влияет на предварительно созданную dll.

...