Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация ObservableCollection, сохарение и загрузка данных из файла 
V
    Опции темы
dAlex
Дата 28.12.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



Необходимо сделать сохранение коллекции моих классов  и одного дабла в файл и загрузку оттуда (в дальнейшем, и какие-то настройки хранить, отдельно). Можно, конечно, просто тупо каждый раз все записывать и целиком считывать, но, наверное, может это сделать поудобнее, как? В mfc можно было делать просто Serialize, и все записывалось в принципе почти само. Наверняка тут есть что-то подобное?
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
Rogik
Дата 8.1.2011, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Veni vidi vici



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 25.10.2008
Где: Красноярск

Репутация: нет
Всего: 1



Может это поможет
PM MAIL ICQ   Вверх
dAlex
Дата 12.1.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



Rogik, немного не то, там все-таки С++
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
sq1ony
Дата 12.1.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.12.2010

Репутация: нет
Всего: нет



PM MAIL   Вверх
jonie
Дата 12.1.2011, 20:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



а стандартный XmlSerializer  что не работает уже?
Код

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
dAlex
Дата 15.3.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



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

--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
jonie
Дата 15.3.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



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




--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
dAlex
Дата 26.4.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



так, начинаю все-таки разбираться с этим =)
как это выглядит, более подробно: есть у меня класс окна, экземпляр которого создается по кнопке. В этом классе есть несколько коллекций и просто переменных. Соответственно, сам этот класс сериализовать не надо (ведь при десериализации создается новый экземпляр класса на основе данных из файла?), а его членов. С коллекциями вроде все ясно - у них внутри надо пометить сериализуемые элементы. А что делать с классом? Тоже просто пометить элементы, и тогда при десериализации они просто будут проинициализированы заново?
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
-Mikle-
Дата 26.4.2011, 16:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Если я все правильно понял, то речь идет об этом:

Код

[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);



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dAlex
Дата 27.4.2011, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



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

Это сообщение отредактировал(а) dAlex - 27.4.2011, 11:00
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
-Mikle-
Дата 27.4.2011, 12:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(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, который выполняет десериализацию и возвращает загруженный экземпляр.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dAlex
Дата 27.4.2011, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



-Mikle-, спасибо, буду пробовать =)


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

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

Код

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

Collection = newdata.Collection;

--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
-Mikle-
Дата 28.4.2011, 11:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Я не понял типа какого такого...
Имел ввиду типа такого (если по примеру выше):

Код

[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(........);



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dAlex
Дата 28.4.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



а, ясно =) я думала, типа такого MSDN
Код

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
        );
    }

--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
dAlex
Дата 3.5.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



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

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));


Это сообщение отредактировал(а) dAlex - 3.5.2011, 11:07
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1357 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.