Проблема при сериализации хеш-таблицы с использованием datacontract
Я пытаюсь сериализовать хэш-таблицу, используя ссылку
XML-сериализация хеш-таблицы (C#3.0)
Но я получаю ошибку как
Тип 'WpfApplication3.MyHashtable' с именем контракта данных 'AllMyHashtable: http://schemas.datacontract.org/2004/07/WpfApplication3 ' не ожидается. Добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных DataContractSerializer.
Моя программа как под
namespace WpfApplication3
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
MyHashtable ht = new MyHashtable();
DateTime dt = DateTime.Now;
for (int i = 0; i < 10; i++)
ht.Add(dt.AddDays(i), i);
SerializeToXmlAsFile(typeof(Hashtable), ht);
}
private void SerializeToXmlAsFile(Type targetType, Object targetObject)
{
try
{
string fileName = @"C:\output.xml";
DataContractSerializer s = new DataContractSerializer(targetType);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = (" ");
using (XmlWriter w = XmlWriter.Create(fileName, settings))
{
s.WriteObject(w, targetObject);
w.Flush();
}
}
catch (Exception ex) { throw ex; }
}
}
[CollectionDataContract(Name = "AllMyHashtable", ItemName = "MyEntry",
KeyName = "MyDate", ValueName = "MyValue")]
public class MyHashtable : Dictionary<DateTime, int> { }
}
What wrong is hapenning ..please help.
Спасибо
2 ответа
Причина, по которой вы получаете сообщение об ошибке, заключается в следующем:
SerializeToXmlAsFile(typeof(Hashtable), ht);
в вашем методе button1_Click вы передаете тип Hashtable. Конструктор DataContractSerializer инициализирует себя для сериализации объекта указанного вами типа, в данном случае Hashtable. Следовательно, когда вы передаете ему объект типа MyHashtable при вызове
s.WriteObject(w, targetObject);
он не знает, как это обрабатывать. Все, что вам нужно сделать, чтобы сделать эту работу, это изменить строку на:
SerializeToXmlAsFile(typeof(MyHashtable), ht);
Я не пытался запустить код моего selft, но в оригинальном сообщении это выглядит как ошибка:
SerializeToXmlAsFile(typeof(Hashtable), ht);
Как может работать вышеуказанная линия? ht имеет тип MyHashtable.