protobuf.net "لا يمكن تغيير النوع بمجرد إنشاء المسلسل"

StackOverflow https://stackoverflow.com/questions/4006296

سؤال

لدي بعض التعليمات البرمجية البسيطة إلى حد ما باستخدام protobuf.net ، والتي ترمي استثناء غريب للغاية. في metatype.cs على السطر 167 ، يلقي نظرة غير صالحة "لا يمكن تغيير النوع بمجرد إنشاء المسلسل". ماذا يعني هذا وكيف يمكنني إصلاحه؟

رمزتي تبدو هكذا:

تبدأ هذه الطريقة في كل التسلسل:

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;
}

تحرير :: أظن أن هذا قد يكون له علاقة بحقيقة أنني أتوازي بالتوازي. كيف هو threadsafe هو protobuf.net لهذا النوع من الأشياء؟

هل كانت مفيدة؟

المحلول

كيف هو threadsafe هو protobuf.net لهذا النوع من الأشياء؟

حسنًا ، لاحظت شيئًا غريبًا يحدث :)

ما عليك سوى إضافة مكالمة إلى Serializer.prepareserializer في مرحلة ما قبل الرهبة (بدء تشغيل التطبيق هو النقطة الواضحة) ويجب أن تسامحك ...

تحرير: التفكير في الأمر ، هناك تغيير بسيط إلى حد ما يمكنني إجراؤه لمساعدة هذا السيناريو المحدد ؛ سأقوم بتعديل ذلك عندما أحصل على فرصة. أيضا ، هذا يجب أن يؤثر فقط على لم يفرج عنه رمز "V2" (من رمز Sorce) - لا يتأثر DLL المُصمم مسبقًا بهذا AFAIK.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top