Проблема XMLSerialization в WPF - PullRequest
       14

Проблема XMLSerialization в WPF

2 голосов
/ 18 сентября 2011

Предположим, у меня есть следующий класс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NetworkSwitcher
{
    [Serializable]
    class testClass
    {
        public string str;

        public testClass(string _str)
        {
            this.str = _str;
        }
    }
}

Теперь, когда я пытаюсь выполнить следующее, выдается исключение System.Windows.Markup.XamlParseException.

testClass tc = new testClass("Hello World");
XmlSerializer xsl = new XmlSerializer(typeof(testClass));
TextWriter WriteFileStream = new StreamWriter(@"C:\NSProfiles.xml");
xsl.Serialize(WriteFileStream, tc);
WriteFileStream.Close();

Если яиспользуйте простой объект типа String вместо tectClass, код работает нормально:

string data = "hello world";
XmlSerializer xsl = new XmlSerializer(typeof(String));
TextWriter WriteFileStream = new StreamWriter(@"C:\NSProfiles.xml");
xsl.Serialize(WriteFileStream, data);
WriteFileStream.Close();

Итак, я думаю, проблема в определении класса, как я могу это исправить?Я использую WPF, а не WinForms, и у меня нет никакого опыта в WPF или XMLSerialization.Дайте мне знать, если я предоставлю любую другую полезную информацию.

Ответы [ 3 ]

1 голос
/ 18 сентября 2011

Чтобы исправить ошибку, добавьте в класс конструктор по умолчанию (конструктор, не имеющий аргументов).

Выполнение этого самостоятельно остановит ошибку, но может не правильно сериализовать строковое значение.Я не уверен на 100% в этом, так как может быть в состоянии сериализовать открытую переменную-член.

Если нет, вы захотите добавить открытое свойство для строкового значения.

Более "стандартная" реализация этого класса, вероятно, будет выглядеть следующим образом.У вас будет либо второй конструктор, либо просто используйте установщик для установки значения:

[Serializable]     
public class testClass     
{         
    private string str;          

    public testClass()
    {             
    }     

    public string Str
    {
        get { return str; }
        set { str = value; }
    }
} 

Редактировать : добавлен открытый модификатор в класс.Должно работать сейчас.

Кроме того, я предполагаю, что вы вызываете код, который вызывает исключение в конструкторе Window?Это единственная причина, по которой я вижу, что это вызовет исключение XAML.Ошибки в конструкторе помещаются в это исключение XAML, поэтому в этих случаях вы хотите посмотреть на InnerException, чтобы найти проблему.

0 голосов
/ 18 сентября 2011

Это решило проблему.

  • Добавление [Serializable ()] поверх класса.
  • Добавление конструктора по умолчанию.
  • Добавление в класс модификатора открытого класса.

    using System;
    using System.Linq;
    using System.Text;
    using System.Collections.Generic;
    
    namespace NetworkSwitcher
    {
    
        [Serializable()]
        public class testClass
        {
            private string str;
    
            public string _str
            {
                get { return str; }
                set { str = value; }
            }
    
            public testClass()
            {
                //Default
            }
        } 
    }
    
0 голосов
/ 18 сентября 2011

Начните читать документацию по сериализации Xml.

Вам не хватает:

  • Открытое свойство для строки
  • Все атрибуты для сериализации Xml для работы.

Не знаю, откуда исходит ваше исключение XAML, но в этом нет никакого смысла.

...