Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C# сериализация и копия массива

414
11 июня 2012 года
CassandraDied
763 / / 24.05.2012
Ein:
Как можно сериализовать HashSet<int> через SOAPFormater?
Zwei:
Как сделать копию массива int [ , ], чтобы в копии не было ссылок на исходный массив и он являлся обособленным?
297
11 июня 2012 года
koodeer
1.2K / / 02.05.2009
Ichi.
Никак. SoapFormatter не поддерживает дженерики.
И вообще, этот класс является устаревшим. Используй что-нибудь другое.

Ni.
 
Код:
int[,] arr1 = new int[2, 2] { { 1, 2 }, { 3, 4 } };

// Первый способ
int[,] arr2 = (int[,])arr1.Clone();

// Второй способ. Память под массив нужно выделить самому.
int[,] arr3 = new int[2, 2];
Buffer.BlockCopy(arr1, 0, arr3, 0, arr1.Length * sizeof(int));
Подробности о работе Array.Clone и Buffer.BlockCopy - в MSDN.
414
11 июня 2012 года
CassandraDied
763 / / 24.05.2012
Цитата: koodeer
Ichi.
Никак. SoapFormatter не поддерживает дженерики.


Что, совсем? Даже как-нибудь хитро с написанием своего метода сериализации отдельно для одного поля во всём классе, а, чтобы всё остальное, кроме HashSet сериализовалось человеческим способом?

79K
12 июня 2012 года
dron5901
21 / / 12.05.2012
попробуй атрибут [NonSerialized] над HashSet, будет выглядеть примерно так:

Код:
[Serializable]
    public class Author
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public DateTime DOB { get; set; }

        public string BookTitle { get; set; }
       
        public bool IsMVP { get; set; }
        [NonSerialized]
        HashSet<int> set = new HashSet<int>();
    }
414
12 июня 2012 года
CassandraDied
763 / / 24.05.2012
Цитата: dron5901
попробуй атрибут [NonSerialized] над HashSet, будет выглядеть примерно так:

Код:
[Serializable]
    public class Author
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public DateTime DOB { get; set; }

        public string BookTitle { get; set; }
       
        public bool IsMVP { get; set; }
        [NonSerialized]
        HashSet<int> set = new HashSet<int>();
    }


Мне нужно его сериализовать. Ну, не то чтобы нужно...Просто хочется знать, что можно сделать, чтобы сериализовать его именно в XML. В классе есть приватные поля, поэтому XMLformater не подойдёт.

79K
12 июня 2012 года
dron5901
21 / / 12.05.2012
подключи библиотеку using System.Xml.Serialization;
используй XmlSerializer

простой пример, используя класс описанный выше:

Код:
XmlSerializer ser = new XmlSerializer(typeof(Author));
            using (FileStream fs = new FileStream("data.xml",FileMode.Create,FileAccess.Write))
            {
                ser.Serialize(fs, new Author()
                    {
                        Name="1",
                        IsMVP = true,
                        ID=10,
                        DOB=DateTime.Now,
                        BookTitle="book"
                    });
            }
79K
12 июня 2012 года
dron5901
21 / / 12.05.2012
И чтобы сериализовать приватное поля нужно, чтобы у поля было общедоступное свойство
414
12 июня 2012 года
CassandraDied
763 / / 24.05.2012
В том-то всё и дело, что публичных свойств у приватных полей нет.
Что-то тема непредвиденно ушла с намеченного пути.
Суть: есть класс с приватными полями, но без публичных свойств. Всё, что есть в классе, нужно сериализовать в XML. Либо через SOAP, либо через XML. Бинарная сериализация не подойдёт. И заменять HashSet массивом мне не хочется.
Вот такая вот дурацкая суть. Это даже не мне довелось придумать.
79K
12 июня 2012 года
dron5901
21 / / 12.05.2012
в общем я немножко тут набросал, проводить сериализацию через DataContract

Создаем класс:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.ServiceModel;
using System.Xml;

namespace WindowsFormsApplication1
{  
    [DataContract]
    public class Person
    {
        [DataMember]
        private int id;
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public HashSet<int> Collection = new HashSet<int>();
    }
}
Дальше сам код сериализации:

 
Код:
private void SerializationXml(Person p)
        {
           
            DataContractSerializer ser = new DataContractSerializer(typeof(Person));

            using (FileStream fs = new FileStream("data.xml", FileMode.Create, FileAccess.Write))
                ser.WriteObject(fs, p);

        }
79K
12 июня 2012 года
dron5901
21 / / 12.05.2012
все поля класс обязательно должны быть отмечены атрибутом [DataMember]
нужно еще подключить сборку System.Runtime.Serilization;
Если C# все равно не будет понимать атрибут [DataContract], то через добавление ссылки, добавь ссылку на сборку System.Runtime.Serilization
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог