Frage

Wir haben gerade festgestellt, dass wir bekommen "Rahmungsfehler”(Wie von den WCF -Protokollen berichtet) beim Ausführen unseres Systems auf einem Kundentestgerät.

Auf unseren Entwicklungsmaschinen funktioniert alles in Ordnung.

Wir haben eine abstrakte Basisklasse mit bekannten Attributen für alle Subklassen. Eine der Subklassen fehlt das DataContract -Attribut.

Allerdings hat alles auf unserer Testmaschine funktioniert!

Auf dem Customer Test Machine haben wir "Rahmenfehler" erhalten. Wenn Sie die WCF -Protokolle angezeigt, ist dies nicht die Fehlermeldung, die ich in der Vergangenheit gesehen habe, als ein DataContract -Attribut oder ein bekannter Attribut bekannt ist.

Ich möchte darauf auf den Grund gehen, da wir nicht mehr Vertrauen in unsere Fähigkeit haben können, das System zu testen, bevor wir es dem Kunden geben, bis wir unsere Maschinen dazu bringen können, sich die als Kundenmaschinen zu verhalten.


Code, die versuchen zu zeigen, wovon ich spreche (nicht den wirklichen Code)

    [DataContract()]
    [KnownType(typeof(SubClass1))]
    [KnownType(typeof(SubClass2))] 
    // other subclasses with data members
    public abstract class Base
    {
        [DataMember]
        public int LotsMoreItemsThenThisInRealLife;
    }

    /// <summary>
    /// This works on some machines (not not others) when passed to Contract::DoIt, 
    /// note the missing [DataContract()]
    /// </summary>
    public class SubClass1 : Base
    {
        // has no data members
    }

    /// <summary>
    /// This works in all cases when passed to Contract::DoIt
    /// </summary>
    [DataContract()]
    public class SubClass2 : Base
    {
        // has no data members
    }

    public interface IContract
    {
        void DoIt(Base[] items);
    }

    public static class MyProgram
    {
        public static IContract ConntectToServerOverWCF()
        {
            // lots of code ...
            return null;
        }

        public static void Startup()
        {
            IContract server = ConntectToServerOverWCF();

            // this works all of the time
            server.DoIt(new Base[]{new SubClass2(){LotsMoreItemsThenThisInRealLife=2}});

            // this works "in develperment" e.g. on our machines, but not on the customer's test machines! 
            server.DoIt(new Base[] { new SubClass1() { LotsMoreItemsThenThisInRealLife = 2 } });
        }
    }

Update Ich wurde mitgeteilt, dass .NET 3.5 SP1 eingeschaltet ist alle Die Maschinen, ich habe das noch nicht für mich selbst verzeichnet.

War es hilfreich?

Lösung 2

Ich glaube, das Problem ist, dass ein Teil der Maschine nicht 3,5 hatte SP1 auf sie.

Andere Tipps

Wir hatten ein ähnliches Problem: Eine Datei war eine ordnungsgemäße Datenvertragsdeserialisierung aller unserer Testmaschinen. Auf einer bestimmten Kundenmaschine ist es jedoch mit dem Fehler fehlgeschlagen

Klassenname kann nicht serialisiert werden. Überlegen Sie, es mit dem zu markieren DataContractAttribute zuschreiben und alle Mitglieder markieren, die Sie mit dem serialisieren möchten DataMemberAttribute Attribut.

Es stellt sich heraus, dass der Cusotmer .NET Framework 3.0 ausgeführt wurde, während alle unsere Tests auf .NET Framework 3.5 SP1 durchgeführt wurden.

Es scheint, dass das Verhalten des Datenvertrags -Serializers unterschiedlich .NET Framework 3.0 und .NET Framework 3.5 ist. Wenn eine Klasse serialisierbar mit XML ist, ist sie automatisch auch serialisierbar. Dies ist jedoch bei .NET Framework 3.0 nicht der Fall - die Klasse muss mit dekoriert werden [DataContract] oder [Serializable].

Hoffe das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top