3 Stimmen

XML Serialisierung und eine Klasse mit binärer Eigenschaft - Wie kann ich das zum Laufen bringen?

Ich habe die folgende Serialisierungsmethode wie unten gezeigt. Das Problem ist, dass ich versuche, eine Klasse an sie zu übergeben, die eine Eigenschaft vom Typ Binär enthält. Die Serialisierung schlägt aufgrund dieses Eigenschaftstyps fehl. Gibt es einen Weg, eine Klasse mit einer Eigenschaft vom Typ Binär zu serialisieren?

    private string Serialize(TEntity instance)
    {
        string retStr = "";
        XmlSerializer xs = new XmlSerializer(typeof(TEntity));
        System.IO.StringWriter writer = new System.IO.StringWriter();
        xs.Serialize(writer, instance);
        retStr = writer.ToString();
        writer.Close();

        return retStr;
    }

Hier ist der Teil der Klasse, der die Binär-Eigenschaft repräsentiert.

    /// 
    /// Versionsnummer
    /// 
    [DataMember(Order = 5)]
    public System.Data.Linq.Binary VersionNumber { get; set; }

0 Stimmen

"Binary" ist kein .NET-Datentyp. Wie ist es definiert? Bitte geben Sie auch die genaue Ausnahme an, die Sie erhalten. Fangen Sie die Ausnahme ab und geben Sie dann ex.ToString() aus.

0 Stimmen

Können Sie uns einen Ausschnitt des Codes zeigen, in dem diese Eigenschaft definiert ist?

1 Stimmen

Sind Sie an einem Workaround interessiert oder wollen Sie einfach nur Ihren Weg gehen? Können Sie die Klasse ändern, mit der Sie Probleme beim Serialisieren haben? Wenn Ihnen die Eigenschaft wirklich egal ist, könnten Sie [XmlIgnore] ausprobieren?

4voto

awpross Punkte 41

Ein wenig spät, aber wenn jemand anderes nach einer Lösung sucht, werde ich hier meine posten:

Zuerst fügen Sie System.Xml.Serialization.XmlIgnore der Binary-Eigenschaft hinzu:

in meinem Fall:

  _
    Public Property Bericht() As System.Data.Linq.Binary
        Get
            Return Me._Bericht.Value
        End Get
        Set(value As System.Data.Linq.Binary)
            If (Object.Equals(Me._Bericht.Value, Value) = False) Then
                Me.OnBerichtChanging(Value)
                Me.SendPropertyChanging()
                Me._Bericht.Value = Value
                Me.SendPropertyChanged("Bericht")
                Me.OnBerichtChanged()
            End If
        End Set
    End Property

Zweitens fügen Sie eine neue Eigenschaft hinzu, die den binären Wert als byte() verfügbar macht

Public Property BerichtAsByte As Byte()
        Get
            If Me.Bericht Is Nothing Then Return Nothing
            Return Me.Bericht.ToArray

        Set(value As Byte())
            If value Is Nothing Then
                Me.Bericht = Nothing
            Else
                Me.Bericht = New Data.Linq.Binary(value)
            End If

Und das war's. Jetzt ist die Entität serialisierbar und speichert alle Eigenschaften.

2voto

Vivek Punkte 16076

Warum wandeln Sie nicht einfach den System.Linq.Binary in byte[] um? Intern sind beide gleich, außer dass System.Linq.Binary unveränderlich ist. Außerdem hat die Binary-Klasse keinen Standardkonstruktor, weshalb die Serialisierung fehlschlägt.

Weitere Informationen:

0voto

John Saunders Punkte 159011

Obwohl dies keine vollständige Lösung für Ihr Problem ist, versuchen Sie bitte den folgenden Code:

private string Serialize(TEntity instance)
{
    try
    {
        XmlSerializer xs = new XmlSerializer(typeof(TEntity));
        using (System.IO.StringWriter writer = new System.IO.StringWriter())
        {
            xs.Serialize(writer, instance);
            return writer.ToString();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        throw;
    }
}

0 Stimmen

@John - Ich möchte nicht unhöflich sein, aber was soll dieser Code erreichen? Im Grunde genommen ist es das, was ich gerade mache.

0 Stimmen

@Randy: Es ist das, was du falsch gemacht hast, und wenn du eine Ausnahme bekommst, fängt es sie für dich ab, um sie hier zu posten.

0voto

RedDeckWins Punkte 2090

Haftungsausschluss: Ich bin kein Experte für WCF oder Serialisierung, und die unten stehende Lösung ist bestenfalls hacky und wurde nur kurz überprüft.

public class HasBinaryProperty
{
    public byte[] versionBytes;

    public HasBinaryProperty()
    {//Ignorieren Sie dies, ich habe es verwendet, um die Serialisierung der Klasse kurz zu testen
        Random rand = new Random();
        byte[] bytes = new byte[20];
        rand.NextBytes(bytes);
        this.VersionNumber = new Binary(bytes);
    }

    [XmlIgnore]
    public Binary VersionNumber
    {
        get
        {
            return new Binary(this.versionBytes);
        }
        set
        {
            this.versionBytes = value.ToArray();
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X