Warum kann ich nicht mit WCF DataContract-und ISerializable auf die gleiche Klasse?

Habe ich eine Klasse, die ich brauche, um in der Lage sein serialisiert werden, um eine SQL Server-session-variable und werden über einen WCF-Service. Ich habe erklärt es wie folgt

namespace MyNM
{
[Serializable] 
[DataContract(Name = "Foo", Namespace = "http://www.mydomain.co.uk")]

public class Foo : IEntity, ISafeCopy<Foo>
{
    [DataMember(Order = 0)] 
    public virtual Guid Id { get; set; }

    [DataMember(Order = 1)] 
    public virtual string a { get; set; }

    DataMember(Order = 2)]
    public virtual Bar c { get; set; }

    /* ISafeCopy implementation */
}


[Serializable]
[DataContract(Name = "Bar ", Namespace = "http://www.mydomain.co.uk")]
public class Bar : IEntity, ISafeCopy<Bar>
{
    #region Implementation of IEntity

    DataMember(Order = 0)]
    public virtual Guid Id { get; set; }
    [DataMember(Order = 1)]
    public virtual Baz y { get; set; }

    #endregion

    /* ISafeCopy implementation*/
}


[Serializable]
[DataContract]
public enum Baz
{
    [EnumMember(Value = "one")]
    one,
    [EnumMember(Value = "two")]
    two,
    [EnumMember(Value = "three")]
    three
}

Aber wenn ich versuche und rufen Sie diesen service, bekomme ich die folgende Fehlermeldung in der trace-log.

"- System.- Laufzeit.Serialisierung.InvalidDataContractException:
Geben
'BarProxybcb100e8617f40ceaa832fe4bb94533c'
kann nicht sein, ISerializable und haben
Datacontractattribute aktivieren Attribut."

Wenn ich mit dem Serializable-Attribut der WCF-Dienst arbeiten, aber wenn das Objekt nicht serialisiert werden, um session. Wenn ich entfernen Sie das DataContract-Attribut aus der Klasse Bar, die WCF-Dienst kann nicht sagen

Geben
'BarProxy3bb05a31167f4ba492909ec941a54533'
mit Daten-Vertrag name
'BarProxy3bb05a31167f4ba492909ec941a54533:http://schemas.datacontract.org/2004/07/'
ist nicht zu erwarten. Fügen Sie alle Arten nicht
bekannt ist statisch in der Liste der bekannten
Arten - zum Beispiel, indem der
KnownTypeAttribute-Attribut oder durch
hinzufügen zu der Liste der bekannten Typen
übergeben DataContractSerializer

Ich habe versucht, das hinzufügen einer KnownType-Attribut auf die Klasse "foo"

[KnownType(typeof(Bar))]

Aber ich bekomme immer noch den gleichen Fehler.

Kann mir jemand helfen mit diesem?

Vielen Dank

Dave

InformationsquelleAutor der Frage Dave | 2010-03-17

Schreibe einen Kommentar