Проблема сериализации пользовательской коллекции - PullRequest
0 голосов
/ 15 октября 2018

У меня есть DataGrid, который содержит параметры конфигурации для робота, над которым я работаю.Я пытаюсь добавить функциональность для импорта / экспорта наборов параметров, и я пытаюсь сделать это с помощью XML-сериализации.

Я новичок в сериализации XML, и все еще довольно новичок в C #, поэтому я не знаю, где я ошибаюсь.

Я создал класс, показанный ниже, для хранения значений из сетки данных.Я не мог использовать тот же тип, который заполняет сетку данных, так как в этом классе так много разрозненной логики и мусора, что сериализация никогда не будет работать.

[Serializable]
public class CmcdSerializationBuffer
{
    [XmlElement]
    public string Name { get; set; }

    [XmlElement]
    public string TypeAssemblyQualifiedName { get; set; }

    private string _storedValue;
    [XmlElement]
    public string StoredValue
    {
        get { return _storedValue; }
        set { _storedValue = value; }
    }

    private string _temporaryValueFromUser;
    public string TemporaryValueFromUser
    {
        get { return _temporaryValueFromUser; }
        set { _temporaryValueFromUser = value; }
    }

    [XmlElement]
    public string DefaultValue { get; set; }

    public CmcdSerializationBuffer()
    {

    }

    public CmcdSerializationBuffer(CmcdConfigurationParameter parameter)
    {
        Name = parameter.Name;
        TypeAssemblyQualifiedName = parameter.TypeAssemblyQualifiedName;
        StoredValue = parameter.StoredValue;
        TemporaryValueFromUser = parameter.TemporaryValueFromUser;
        DefaultValue = parameter.DefaultValue;
    }

}

Так что я сделал этот класс, чтобы обойти это, он просто принимает CmcdConfigurationParameter (тип, заполняющий DataGrid) и копирует значения.

Это, кстати, сериализуется правильно.

Я хочу экспортировать несколько из них в один файл, поэтому я решил создать собственный класс коллекции, содержащий объекты CmcdSerializatinonBuffer.Вот что у меня есть:

[Serializable]
public class ValuesToExport
{
    [XmlArray("ParamsList")]
    public List<CmcdSerializationBuffer> Parameters { get; set; }

    public ValuesToExport()
    {
        Parameters = new List<CmcdSerializationBuffer>();
    }

    public ValuesToExport(List<CmcdSerializationBuffer> parameters)
    {
        Parameters = new List<CmcdSerializationBuffer>();
        Parameters = parameters;
    }
}

А вот функция, которую я использую для экспорта значений:

public void Export()
    {
        ValuesToExport val = new ValuesToExport();
        CmcdSerializationBuffer tempBuffer = new CmcdSerializationBuffer();
        foreach (CmcdConfigurationParameter param in MasterDataGrid.ItemsSource)
        {

            tempBuffer = new CmcdSerializationBuffer(param);
            val.Parameters.Add(tempBuffer);
            Console.WriteLine(val.Parameters.Count());
        }


        MessageBox.Show(MasterDataGrid.ItemsSource.GetType().ToString());
        //ValuesToExport val = new ValuesToExport(MasterDataGrid.ItemsSource);

        XmlSerializer serialiser = new XmlSerializer(typeof(ValuesToExport));

        using (FileStream fs = new FileStream("D:\\test\\testserialization.txt", FileMode.OpenOrCreate))
        using (TextWriter writer = new StreamWriter(fs))
        {
            serialiser.Serialize(writer, val.Parameters);
            Console.WriteLine(val.Parameters);
            writer.Close();
        }
    }

Я не знаю, является ли это правильным способом сделать это, но это работает для одного параметра.Однако, когда я пытаюсь сериализовать свой ValuesToExport класс, я получаю сообщение об ошибке:

"Невозможно привести объект типа" System.Collections.Generic.List`1 [Hamilton.HST.MotionController.DeviceConfiguration.CmcdSerializationBuffer] 'для ввода' Hamilton.HST.MotionController.DeviceUI.ValuesToExport '. "

И я не смог это исправить.Если кто-нибудь знает, как я могу это исправить, я хотел бы знать.Спасибо!

1 Ответ

0 голосов
/ 15 октября 2018

Вы получаете эту ошибку, потому что вы создали XmlSerializer для типа ValuesToExport, но когда вы вызываете метод .Serialize, вы передаете ему список CmcdSerializationBuffer.Это не тот тип, которого ожидал сериализатор, поэтому он выдает ошибку.

Чтобы исправить это, вы можете изменить эту строку:

serialiser.Serialize(writer, val.Parameters);

на эту:

serialiser.Serialize(writer, val);
...