2009-06-16 13 views
2

Ich verwende C# mit .NET 3.5.Serialisieren einer DataTable mit einer IPAddress-Spalte

Ich verwende die System.Configuration.ApplicationSettingsBase-Klasse zum Laden und Speichern von Anwendungseinstellungen. Eine der Einstellungen, die ich beibehalten möchte, ist eine speicherinterne System.Data.DataTable. Die DataTable enthält nur zwei Spalten vom Typ UInt32 bzw. System.Net.IPAddress. Wenn ich die Funktion Save() auf der ApplicationSettingsBase aufrufen, erhalte ich die folgende Ausnahme:

InvalidOperationException: System.Net.IPAddress kann nicht serialisiert werden, da es keinen parameterlosen Konstruktor hat.

Wenn ich nur ein System.Net.IPAddress-Objekt als Einstellung anstelle der DataTable verwenden, habe ich kein Problem. Da ist etwas in der DataTable, die die Ausnahme verursacht.

Irgendwelche Ideen, was passieren könnte? Irgendwelche Ideen, wie man es beheben kann?

Antwort

1

Der Fehler erklärt das Problem - speichern Sie es stattdessen als Zeichenfolge. Wenn Sie die IPAddress-Klasse verwenden müssen, können Sie ToString und Parse verwenden, um zwischen den beiden zu konvertieren. Der Fehler wird aufgrund der Art auftreten, in der DataTable die Serialisierung vornimmt.

diesen Code Versuchen:

IPAddress ip = IPAddress.Parse("192.168.0.1"); 
XmlSerializer serializer = new XmlSerializer(typeof(IPAddress)); 
MemoryStream ms = new MemoryStream(); 
serializer.Serialize(ms, ip); 

dies Dann versuchen:

IPAddress ip = IPAddress.Parse("192.168.0.1"); 
BinaryFormatter serializer = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(); 
serializer.Serialize(ms, ip); 

Sie werden sehen, dass, wenn Sie die IP-Adresse Objekt in einer Datentabelle setzen die XmlSerializer standardmäßig verwendet wird.

Interessanterweise versuchen Sie, die RemotingFormat-Eigenschaft zu binär zu ändern, ich glaube, dass das das Problem beheben kann. DataTable.RemotingFormat

+0

Ihr Problem sicherlich eine Möglichkeit, lösen könnte, dass es zu beheben, aber es erklärt nicht, warum das Problem existiert. Warum benötigt die Serialisierung der DataTable IPAddress für einen parameterlosen Konstruktor, wenn ich ein IPAddress-Objekt direkt ohne Probleme serialisieren kann? –

+0

@ Matt- Ich habe jetzt ein Codebeispiel hinzugefügt. – RichardOD

+0

Bingo! Das habe ich gesucht. Vielen Dank! –

0

ich denke, die XmlElementAttribute

+0

Wie würde ich das XmlElementAttribute auf die IPAddress-Spalte der DataTable anwenden? –

Verwandte Themen