Mam listę obiektów i muszę ją zapisać w swoim komputerze. Przeczytałem kilka forów i wiem, że obiekt ma być Serializable
. Ale byłoby miło, gdybym mógł dostać przykład. Na przykład, jeśli mam:
[Serializable]
public class SomeClass
{
public string someProperty { get; set; }
}
SomeClass object1 = new SomeClass { someProperty = "someString" };
Ale jak mogę przechowywać object1
gdzieś na moim komputerze i później odzyskiwać?
c#
serialization
stream
Tono Nam
źródło
źródło
Odpowiedzi:
Możesz użyć następujących:
/// <summary> /// Serializes an object. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="serializableObject"></param> /// <param name="fileName"></param> public void SerializeObject<T>(T serializableObject, string fileName) { if (serializableObject == null) { return; } try { XmlDocument xmlDocument = new XmlDocument(); XmlSerializer serializer = new XmlSerializer(serializableObject.GetType()); using (MemoryStream stream = new MemoryStream()) { serializer.Serialize(stream, serializableObject); stream.Position = 0; xmlDocument.Load(stream); xmlDocument.Save(fileName); } } catch (Exception ex) { //Log exception here } } /// <summary> /// Deserializes an xml file into an object list /// </summary> /// <typeparam name="T"></typeparam> /// <param name="fileName"></param> /// <returns></returns> public T DeSerializeObject<T>(string fileName) { if (string.IsNullOrEmpty(fileName)) { return default(T); } T objectOut = default(T); try { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(fileName); string xmlString = xmlDocument.OuterXml; using (StringReader read = new StringReader(xmlString)) { Type outType = typeof(T); XmlSerializer serializer = new XmlSerializer(outType); using (XmlReader reader = new XmlTextReader(read)) { objectOut = (T)serializer.Deserialize(reader); } } } catch (Exception ex) { //Log exception here } return objectOut; }
źródło
string attributeXml = string.Empty;
wDeSerializeObject
nigdy nie jest używany;)Właśnie napisałem wpis na blogu dotyczący zapisywania danych obiektu w formacie Binary, XML lub Json . Masz rację, że musisz udekorować swoje klasy atrybutem [Serializable], ale tylko wtedy, gdy używasz serializacji binarnej. Możesz preferować użycie serializacji XML lub Json. Oto funkcje, które pozwalają to zrobić w różnych formatach. Zobacz mój wpis na blogu, aby uzyskać więcej informacji.
Dwójkowy
/// <summary> /// Writes the given object instance to a binary file. /// <para>Object type (and all child types) must be decorated with the [Serializable] attribute.</para> /// <para>To prevent a variable from being serialized, decorate it with the [NonSerialized] attribute; cannot be applied to properties.</para> /// </summary> /// <typeparam name="T">The type of object being written to the binary file.</typeparam> /// <param name="filePath">The file path to write the object instance to.</param> /// <param name="objectToWrite">The object instance to write to the binary file.</param> /// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param> public static void WriteToBinaryFile<T>(string filePath, T objectToWrite, bool append = false) { using (Stream stream = File.Open(filePath, append ? FileMode.Append : FileMode.Create)) { var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); binaryFormatter.Serialize(stream, objectToWrite); } } /// <summary> /// Reads an object instance from a binary file. /// </summary> /// <typeparam name="T">The type of object to read from the binary file.</typeparam> /// <param name="filePath">The file path to read the object instance from.</param> /// <returns>Returns a new instance of the object read from the binary file.</returns> public static T ReadFromBinaryFile<T>(string filePath) { using (Stream stream = File.Open(filePath, FileMode.Open)) { var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); return (T)binaryFormatter.Deserialize(stream); } }
XML
Wymaga dołączenia zestawu System.Xml do projektu.
/// <summary> /// Writes the given object instance to an XML file. /// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para> /// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [XmlIgnore] attribute.</para> /// <para>Object type must have a parameterless constructor.</para> /// </summary> /// <typeparam name="T">The type of object being written to the file.</typeparam> /// <param name="filePath">The file path to write the object instance to.</param> /// <param name="objectToWrite">The object instance to write to the file.</param> /// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param> public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new() { TextWriter writer = null; try { var serializer = new XmlSerializer(typeof(T)); writer = new StreamWriter(filePath, append); serializer.Serialize(writer, objectToWrite); } finally { if (writer != null) writer.Close(); } } /// <summary> /// Reads an object instance from an XML file. /// <para>Object type must have a parameterless constructor.</para> /// </summary> /// <typeparam name="T">The type of object to read from the file.</typeparam> /// <param name="filePath">The file path to read the object instance from.</param> /// <returns>Returns a new instance of the object read from the XML file.</returns> public static T ReadFromXmlFile<T>(string filePath) where T : new() { TextReader reader = null; try { var serializer = new XmlSerializer(typeof(T)); reader = new StreamReader(filePath); return (T)serializer.Deserialize(reader); } finally { if (reader != null) reader.Close(); } }
Json
Należy dołączyć odwołanie do zestawu Newtonsoft.Json, które można uzyskać z pakietu NuGet Json.NET .
/// <summary> /// Writes the given object instance to a Json file. /// <para>Object type must have a parameterless constructor.</para> /// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para> /// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [JsonIgnore] attribute.</para> /// </summary> /// <typeparam name="T">The type of object being written to the file.</typeparam> /// <param name="filePath">The file path to write the object instance to.</param> /// <param name="objectToWrite">The object instance to write to the file.</param> /// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param> public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new() { TextWriter writer = null; try { var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite); writer = new StreamWriter(filePath, append); writer.Write(contentsToWriteToFile); } finally { if (writer != null) writer.Close(); } } /// <summary> /// Reads an object instance from an Json file. /// <para>Object type must have a parameterless constructor.</para> /// </summary> /// <typeparam name="T">The type of object to read from the file.</typeparam> /// <param name="filePath">The file path to read the object instance from.</param> /// <returns>Returns a new instance of the object read from the Json file.</returns> public static T ReadFromJsonFile<T>(string filePath) where T : new() { TextReader reader = null; try { reader = new StreamReader(filePath); var fileContents = reader.ReadToEnd(); return JsonConvert.DeserializeObject<T>(fileContents); } finally { if (reader != null) reader.Close(); } }
Przykład
// Write the contents of the variable someClass to a file. WriteToBinaryFile<SomeClass>("C:\someClass.txt", object1); // Read the file contents back into a variable. SomeClass object1= ReadFromBinaryFile<SomeClass>("C:\someClass.txt");
źródło
Będziesz musiał do czegoś serializować: to znaczy wybrać plik binarny lub XML (dla domyślnych serializatorów) lub napisać niestandardowy kod serializacji w celu serializacji do innego formularza tekstowego.
Po wybraniu tego serializacja (normalnie) wywoła strumień, który zapisuje do jakiegoś pliku.
Tak więc, z twoim kodem, gdybym używał serializacji XML:
var path = @"C:\Test\myserializationtest.xml"; using(FileStream fs = new FileStream(path, FileMode.Create)) { XmlSerializer xSer = new XmlSerializer(typeof(SomeClass)); xSer.Serialize(fs, serializableObject); }
Następnie do deserializacji:
using(FileStream fs = new FileStream(path, FileMode.Open)) //double check that... { XmlSerializer _xSer = new XmlSerializer(typeof(SomeClass)); var myObject = _xSer.Deserialize(fs); }
UWAGA: Ten kod nie został skompilowany, nie mówiąc już o uruchomieniu - mogą wystąpić błędy. Ponadto zakłada się, że serializacja / deserializacja jest całkowicie wyjęta z pudełka. Jeśli potrzebujesz niestandardowego zachowania, musisz wykonać dodatkową pracę.
źródło
1. Przywróć obiekt z pliku
Z tego miejsca możesz deserializować obiekt z pliku na dwa sposoby.
Rozwiązanie-1: wczytaj plik do ciągu i zdeserializuj JSON do typu
string json = File.ReadAllText(@"c:\myObj.json"); MyObject myObj = JsonConvert.DeserializeObject<MyObject>(json);
Rozwiązanie-2: Deserializacja JSON bezpośrednio z pliku
using (StreamReader file = File.OpenText(@"c:\myObj.json")) { JsonSerializer serializer = new JsonSerializer(); MyObject myObj2 = (MyObject)serializer.Deserialize(file, typeof(MyObject)); }
2. Zapisz obiekt do pliku
od tutaj można serializacji obiektu do pliku w dwóch sposób.
Rozwiązanie-1: Serializuj JSON do ciągu, a następnie zapisz ciąg do pliku
string json = JsonConvert.SerializeObject(myObj); File.WriteAllText(@"c:\myObj.json", json);
Rozwiązanie-2: Serializuj JSON bezpośrednio do pliku
using (StreamWriter file = File.CreateText(@"c:\myObj.json")) { JsonSerializer serializer = new JsonSerializer(); serializer.Serialize(file, myObj); }
3. Extra
Możesz pobrać Newtonsoft.Json z NuGet za pomocą następującego polecenia
źródło
** 1. Przekonwertuj ciąg json na base64string i zapisz lub dołącz go do pliku binarnego. 2. Odczytaj base64string z pliku binarnego i zdeserializuj za pomocą BsonReader. **
public static class BinaryJson { public static string SerializeToBase64String(this object obj) { JsonSerializer jsonSerializer = new JsonSerializer(); MemoryStream objBsonMemoryStream = new MemoryStream(); using (BsonWriter bsonWriterObject = new BsonWriter(objBsonMemoryStream)) { jsonSerializer.Serialize(bsonWriterObject, obj); return Convert.ToBase64String(objBsonMemoryStream.ToArray()); } //return Encoding.ASCII.GetString(objBsonMemoryStream.ToArray()); } public static T DeserializeToObject<T>(this string base64String) { byte[] data = Convert.FromBase64String(base64String); MemoryStream ms = new MemoryStream(data); using (BsonReader reader = new BsonReader(ms)) { JsonSerializer serializer = new JsonSerializer(); return serializer.Deserialize<T>(reader); } } }
źródło
Możesz użyć JsonConvert z biblioteki Newtonsoft. Aby serializować obiekt i zapisać do pliku w formacie JSON:
I deserializacja z powrotem do obiektu:
var obj = JsonConvert.DeserializeObject<ObjType>(File.ReadAllText(filePath));
źródło