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));
C# сериализация и копия массива
Как можно сериализовать HashSet<int> через SOAPFormater?
Zwei:
Как сделать копию массива int [ , ], чтобы в копии не было ссылок на исходный массив и он являлся обособленным?
Никак. SoapFormatter не поддерживает дженерики.
И вообще, этот класс является устаревшим. Используй что-нибудь другое.
Ni.
Код:
Цитата: koodeer
Ichi.
Никак. SoapFormatter не поддерживает дженерики.
Никак. SoapFormatter не поддерживает дженерики.
Что, совсем? Даже как-нибудь хитро с написанием своего метода сериализации отдельно для одного поля во всём классе, а, чтобы всё остальное, кроме 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>();
}
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>();
}
Цитата: 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>();
}
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 не подойдёт.
используй 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"
});
}
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"
});
}
И чтобы сериализовать приватное поля нужно, чтобы у поля было общедоступное свойство
Что-то тема непредвиденно ушла с намеченного пути.
Суть: есть класс с приватными полями, но без публичных свойств. Всё, что есть в классе, нужно сериализовать в XML. Либо через SOAP, либо через XML. Бинарная сериализация не подойдёт. И заменять HashSet массивом мне не хочется.
Вот такая вот дурацкая суть. Это даже не мне довелось придумать.
Создаем класс:
Код:
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>();
}
}
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);
}
{
DataContractSerializer ser = new DataContractSerializer(typeof(Person));
using (FileStream fs = new FileStream("data.xml", FileMode.Create, FileAccess.Write))
ser.WriteObject(fs, p);
}
нужно еще подключить сборку System.Runtime.Serilization;
Если C# все равно не будет понимать атрибут [DataContract], то через добавление ссылки, добавь ссылку на сборку System.Runtime.Serilization