Я использую С# с .NET 3.5.
Я использую класс System.Configuration.ApplicationSettingsBase для загрузки и сохранения настроек приложения. Одним из параметров, которые я хотел бы сохранить, является системная память..Data.DataTable. DataTable содержит только два столбца типа UInt32 и System.Net.IPAddress, соответственно. Когда я вызываю функцию Save() на ApplicationSettingsBase, я получаю следующее исключение:
InvalidOperationException: System.Net.IPAddress не может быть сериализован, потому что у него нет конструктора без параметров.
Если я просто использую объект System.Net.IPAddress в качестве параметра вместо DataTable, у меня нет проблемы. Там что-то происходит в DataTable, вызывающем исключение.
Любые идеи, что может произойти? Любые идеи о том, как исправить это?
Ошибка объясняет проблему: сохраните ее как строку. Если вам нужно использовать класс IPAddress, вы можете использовать ToString и Parse для преобразования между ними. Ошибка будет связана с тем, как DataTable выполняет сериализацию.
Попробуйте этот код:
IPAddress ip = IPAddress.Parse("192.168.0.1");
XmlSerializer serializer = new XmlSerializer(typeof(IPAddress));
MemoryStream ms = new MemoryStream();
serializer.Serialize(ms, ip);
Затем попробуйте следующее:
IPAddress ip = IPAddress.Parse("192.168.0.1");
BinaryFormatter serializer = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
serializer.Serialize(ms, ip);
Вы увидите, что когда вы помещаете объект IPAddress в datatable, XmlSerializer используется по умолчанию.
Интересно попробуйте изменить свойство RemotingFormat на двоичный файл, я считаю, что это может решить проблему. DataTable.RemotingFormat
Я думаю, что XmlElementAttribute может решить вашу проблему