Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Сериализация ObservableCollection


Автор: dAlex 28.12.2010, 15:42
Необходимо сделать сохранение коллекции моих классов  и одного дабла в файл и загрузку оттуда (в дальнейшем, и какие-то настройки хранить, отдельно). Можно, конечно, просто тупо каждый раз все записывать и целиком считывать, но, наверное, может это сделать поудобнее, как? В mfc можно было делать просто Serialize, и все записывалось в принципе почти само. Наверняка тут есть что-то подобное?

Автор: Rogik 8.1.2011, 08:49
Может http://base.vingrad.ru/view/2156-Serializatsiya-klassov поможет

Автор: dAlex 12.1.2011, 10:31
Rogik, немного не то, там все-таки С++

Автор: sq1ony 12.1.2011, 15:53
Посмотрите еще тут
http://social.msdn.microsoft.com/Forums/ru-RU/fordesktopru/thread/34214381-1a8d-45a7-83a1-728760a83592/

Автор: jonie 12.1.2011, 20:05
а стандартный XmlSerializer  что не работает уже?
Код

   XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<string>));
                using (StreamWriter wr = new StreamWriter("somefile.xml"))
                {
                    xs.Serialize(wr, CustomerList);
                }
?

Автор: dAlex 15.3.2011, 15:18
jonie, а у меня коллекция нестандартного типа. Или справится и с таким? Или надо что-то перегрузить?

Автор: jonie 15.3.2011, 23:44
dAlex, главное чтобы эти нестандартные типы были сериализующимися (пометить их ктрибутом Seializable надо как минимум)...


Автор: dAlex 26.4.2011, 12:56
так, начинаю все-таки разбираться с этим =)
как это выглядит, более подробно: есть у меня класс окна, экземпляр которого создается по кнопке. В этом классе есть несколько коллекций и просто переменных. Соответственно, сам этот класс сериализовать не надо (ведь при десериализации создается новый экземпляр класса на основе данных из файла?), а его членов. С коллекциями вроде все ясно - у них внутри надо пометить сериализуемые элементы. А что делать с классом? Тоже просто пометить элементы, и тогда при десериализации они просто будут проинициализированы заново?

Автор: -Mikle- 26.4.2011, 16:32
Если я все правильно понял, то речь идет об этом:

Код

[Serializable]
public class MyCustomData
{
    public double MyDouble { get; set; }
    public ObservableCollection<MyItem> Collection { get; set; }
}

[Serializable]
public class MyItem
{
    public double Prop1 { get; set; }
    public string Prop2 { get; set; }
    public int Prop3 { get; set; }
}

// инициализируем или получаем заполненный экземпляр (неважно)
MyCustomData mydata = .........

XmlSerializer serializer = new XmlSerializer(typeof(MyCustomData));

// сохраним
using (StreamWriter stream = new StreamWriter("somefile.xml"))
    serializer.Serialize(stream, mydata);

// антисохраним
using (StreamReader stream = new StreamReader("somefile.xml"))
     mydata = (MyCustomData)serializer.Deserialize(stream);

Автор: dAlex 27.4.2011, 09:44
-Mikle-, а в MyCustomData не нужно еще помечать отдельно сериализуемые поля? или оно само? smile
и правда, что нужно в каждом сериализуемом классе делать пустой конструктор?
и если мы делаем сериализацию прямо внутри MyCustomData, можно использовать this?

Автор: -Mikle- 27.4.2011, 12:46
Цитата(dAlex @  27.4.2011,  12:44 Найти цитируемый пост)
а в MyCustomData не нужно еще помечать отдельно сериализуемые поля? или оно само?

А ты просто попробуй, по ходу ответишь на вопрос.

Цитата(dAlex @  27.4.2011,  12:44 Найти цитируемый пост)
и правда, что нужно в каждом сериализуемом классе делать пустой конструктор?

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

Цитата(dAlex @  27.4.2011,  12:44 Найти цитируемый пост)
и если мы делаем сериализацию прямо внутри MyCustomData, можно использовать this?

При сохранении (сериализации), нет никаких причин сомневаться в этом. При загрузке (десериазизации) думаю очевидно, что мы не можем написать this = (MyCustomData)serializer.Deserialize(stream) smile. В таких случаях, когда класс сам себя сохраняет/загружает, делают статический метод Load, который выполняет десериализацию и возвращает загруженный экземпляр.

Автор: dAlex 27.4.2011, 13:13
-Mikle-, спасибо, буду пробовать =)


Цитата(-Mikle- @  27.4.2011,  13:46 Найти цитируемый пост)
статический метод Load, который выполняет десериализацию и возвращает загруженный экземпляр

то есть что-то типа такого?

Код

using (StreamReader stream = new StreamReader("somefile.xml"))
     MyCustomData newdata = (MyCustomData)serializer.Deserialize(stream);

Collection = newdata.Collection;

Автор: -Mikle- 28.4.2011, 11:48
Я не понял типа какого такого...
Имел ввиду типа такого (если по примеру выше):

Код

[Serializable]
public class MyCustomData
{
    private static XmlSerializer serializer = new XmlSerializer(typeof(MyCustomData));

    public static MyCustomData Load(Stream stream)
    {
        return (MyCustomData)serializer.Deserialize(stream);
    }

    public void Save(Stream stream)
    {
        serializer.Serialize(stream, this);
    }


    public double MyDouble { get; set; }
    public ObservableCollection<MyItem> Collection { get; set; }
}

///////////////
MyCustomData data = MyCustomData.Load(........);
........
data.Save(........);

Автор: dAlex 28.4.2011, 12:07
а, ясно =) я думала, типа такого http://msdn.microsoft.com/ru-ru/library/58a18dwa.aspx
Код

protected void ReadPO(string filename)
    {
        // Creates an instance of the XmlSerializer class;
        // specifies the type of object to be deserialized.
        XmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder));
        // If the XML document has been altered with unknown 
        // nodes or attributes, handles them with the 
        // UnknownNode and UnknownAttribute events.
        serializer.UnknownNode+= new 
        XmlNodeEventHandler(serializer_UnknownNode);
        serializer.UnknownAttribute+= new 
        XmlAttributeEventHandler(serializer_UnknownAttribute);
    
        // A FileStream is needed to read the XML document.
        FileStream fs = new FileStream(filename, FileMode.Open);
        // Declares an object variable of the type to be deserialized.
        PurchaseOrder po;
        // Uses the Deserialize method to restore the object's state 
        // with data from the XML document. */
        po = (PurchaseOrder) serializer.Deserialize(fs);
        // Reads the order date.
        Console.WriteLine ("OrderDate: " + po.OrderDate);
    
        // Reads the shipping address.
        Address shipTo = po.ShipTo;
        ReadAddress(shipTo, "Ship To:");
        // Reads the list of ordered items.
        OrderedItem [] items = po.OrderedItems;
        Console.WriteLine("Items to be shipped:");
        foreach(OrderedItem oi in items)
        {
            Console.WriteLine("\t"+
            oi.ItemName + "\t" + 
            oi.Description + "\t" +
            oi.UnitPrice + "\t" +
            oi.Quantity + "\t" +
            oi.LineTotal);
        }
        // Reads the subtotal, shipping cost, and total cost.
        Console.WriteLine(
        "\n\t\t\t\t\t Subtotal\t" + po.SubTotal + 
        "\n\t\t\t\t\t Shipping\t" + po.ShipCost + 
        "\n\t\t\t\t\t Total\t\t" + po.TotalCost
        );
    }

Автор: dAlex 3.5.2011, 11:07
Попробовала просто создать сериалайзер, вываливается вот такое:
Код

System.InvalidOperationException was unhandled by user code
  Message=There was an error reflecting type 'NaturalRandomness.Window1'.
  Source=System.Xml
  StackTrace:
       at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
       at System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter limiter)
       at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
       at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
       at System.Xml.Serialization.XmlSerializer..ctor(Type type)
       at NaturalRandomness.Window1.Save(Object sender, RoutedEventArgs e) in D:\Progs\C#\TFromQuik\Window1.xaml.cs:line 441
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
       at System.Windows.Controls.Primitives.ButtonBase.OnClick()
       at System.Windows.Controls.Button.OnClick()
       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
       at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
       at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
       at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
       at System.Windows.Input.InputManager.ProcessStagingArea()
       at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
       at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
       at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
       at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
  InnerException: System.InvalidOperationException
       Message=There was an error reflecting property 'InputBindings'.
       Source=System.Xml
       StackTrace:
            at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
            at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
       InnerException: System.InvalidOperationException
            Message=There was an error reflecting type 'System.Windows.Input.InputBinding'.
            Source=System.Xml
            StackTrace:
                 at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
                 at System.Xml.Serialization.XmlReflectionImporter.CreateArrayElementsFromAttributes(ArrayMapping arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, String arrayElementNs, RecursionLimiter limiter)
                 at System.Xml.Serialization.XmlReflectionImporter.ImportArrayLikeMapping(ArrayModel model, String ns, RecursionLimiter limiter)
                 at System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping accessor, FieldModel model, XmlAttributes a, String ns, Type choiceIdentifierType, Boolean rpc, Boolean openModel, RecursionLimiter limiter)
                 at System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel parent, FieldModel model, XmlAttributes a, String ns, RecursionLimiter limiter)
                 at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
            InnerException: System.InvalidOperationException
                 Message=Cannot serialize member 'System.Windows.Input.InputBinding.Command' of type 'System.Windows.Input.ICommand', see inner exception for more details.
                 Source=System.Xml
                 StackTrace:
                      at System.Xml.Serialization.StructModel.CheckSupportedMember(TypeDesc typeDesc, MemberInfo member, Type type)
                      at System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo propertyInfo)
                      at System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo)
                      at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
                      at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
                      at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
                 InnerException: System.NotSupportedException
                      Message=Cannot serialize member System.Windows.Input.InputBinding.Command of type System.Windows.Input.ICommand because it is an interface.
                      InnerException: 


441 строчка это как раз
Код

XmlSerializer serializer = new XmlSerializer(typeof(Window1));

Автор: jonie 3.5.2011, 11:10
ну не может сериализовать InputBindings. В этом нет ничего необычного.
Вам для сериализации лучше использовать DataContractSerializer - он будет сериализовать только то что помечано, в то время как XmlSerializer пытается скушать всё, что публичное и не помечано NonSerializable ..

ну или явно реализуйте IXmlSerializable интерфейс, или пометьте сериализующий (и десериализующий)  метод атрибутом [OnSerialize] или как-то типа того..

Автор: dAlex 3.5.2011, 14:34
Пробую DataContractSerializer, пометила класс атрибутом DataContract, члены класса - DataMember
Ругается почему-то, что не помечен как DataContract
Код

System.Runtime.Serialization.InvalidDataContractException was unhandled by user code
  Message=Type 'NaturalRandomness.Window1' cannot inherit from a type that is not marked with DataContractAttribute or SerializableAttribute.  Consider marking the base type 'System.Windows.Window' with DataContractAttribute or SerializableAttribute, or removing them from the derived type.
  Source=System.Runtime.Serialization
  StackTrace:
       at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper..ctor(Type type)
       at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type)
       at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type)
       at System.Runtime.Serialization.DataContractSerializer.get_RootContract()
       at System.Runtime.Serialization.DataContractSerializer.InternalWriteStartObject(XmlWriterDelegator writer, Object graph)
       at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
       at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
       at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph)
       at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(Stream stream, Object graph)
       at NaturalRandomness.Window1.Save(Object sender, RoutedEventArgs e) in D:\Progs\C#\TFromQuik\Window1.xaml.cs:line 459
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
       at System.Windows.Controls.Primitives.ButtonBase.OnClick()
       at System.Windows.Controls.Button.OnClick()
       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
       at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
       at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
       at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
       at System.Windows.Input.InputManager.ProcessStagingArea()
       at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
       at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
       at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
       at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
  InnerException: 


Автор: jonie 3.5.2011, 15:50
а да.. есть такая "засада" - нельзя сериазовать несериализуемое)
Вообще вам не надо сериализовать окно. Это бессмыслено.
Вам надо прочитать по какой-либо паттерн, например MVP и сериализовать например Presenter-а данные....

То есть у вас должны быть данные, которые описывают ваше окно, но при всём при этом не привязаны напрямую к окну (напротив - окно привязано к данным должно быть).

Автор: dAlex 3.5.2011, 19:49
jonie, хм. Не знаю даже, как это всё вынести оттуда  smile 

Автор: jonie 3.5.2011, 22:50
ну тогда IXmlSerializable + XmlSerializer

Автор: dAlex 6.5.2011, 11:08
а как сделать это в комплексе с коллекциями? то есть в Window1 мы указываем вручную, кого сериализуем

как в мсдн
Код

 public void WriteXml (XmlWriter writer)
    {
        writer.WriteString(personName);
    }


а коллекцию можно сериализовать XmlSerializer'ом автоматически?

и что делать, если есть уже один интерфейс?

Код

public partial class Window1 : INotifyPropertyChanged

как добавить туда  IXmlSerializable?

Автор: -Mikle- 6.5.2011, 12:56
Цитата(dAlex @  6.5.2011,  14:08 Найти цитируемый пост)
как добавить туда  IXmlSerializable?

Множественное наследование интерфейсов разрешено.
Код

public partial class Window1 : INotifyPropertyChanged, IXmlSerializable


Вообще, все это гем*рно в вашем случае. Лучше делать все по нормальному сразу. Конечно я понимаю, это приходит только с опытом.

Автор: dAlex 6.5.2011, 13:22
-Mikle-, изначально проект был так построен, к сожалению =( да, проблемно будет. Переделывать сейчас никак, там придется очень многое менять.
И опыта правда мало, иногда аж страшно в код смотреть =)

Автор: dAlex 6.5.2011, 14:27
Попробовала сделать так
Код

 public void WriteXml(XmlWriter writer)
        {
            writer.WriteValue(_Summator);
        }
private void Save(object sender, RoutedEventArgs e)
        {           
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.IndentChars = ("    ");
            XmlWriter writer = XmlWriter.Create("appdata.xml", settings);
            WriteXml(writer);         
        }

Класс коллекции Summator помечен  [Serializable]
На моменте writexml вывалилось
Код

System.InvalidOperationException was unhandled by user code
  Message=Token Atomic value in state Start would result in an invalid XML document. Make sure that the ConformanceLevel setting is set to ConformanceLevel.Fragment or ConformanceLevel.Auto if you want to write an XML fragment. 
  Source=System.Xml
  StackTrace:
       at System.Xml.XmlWellFormedWriter.ThrowInvalidStateTransition(Token token, State currentState)
       at System.Xml.XmlWellFormedWriter.AdvanceState(Token token)
       at System.Xml.XmlWellFormedWriter.WriteValue(Object value)
       at NaturalRandomness.Window1.WriteXml(XmlWriter writer) in D:\Progs\C#\TFromQuik\Window1.xaml.cs:line 458
       at NaturalRandomness.Window1.Save(Object sender, RoutedEventArgs e) in D:\Progs\C#\TFromQuik\Window1.xaml.cs:line 472
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
       at System.Windows.Controls.Primitives.ButtonBase.OnClick()
       at System.Windows.Controls.Button.OnClick()
       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
       at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
       at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
       at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
       at System.Windows.Input.InputManager.ProcessStagingArea()
       at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
       at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
       at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
       at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
  InnerException: 



или нельзя так смешивать, а надо приводить коллекцию к строке и обратно?

Автор: dAlex 12.5.2011, 14:21
ура! вынесла данные в отдельный класс, он сериализовался самым простым способом =) спасибо за помощь огромное =))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)