1.Clase BinaryReader y clase BinaryWriter
BinaryReader
Y BinaryWriter
se puede utilizar para entrada / salida binaria, es decir, para leer y escribir tipos de datos básicos (como int
, double
etc.) en lugar de los tipos de bytes originales. BinaryReader
Y BinaryWriter
no es una Stream
subclase de la clase, pero es un Stream
paquete de flujo, en la configuración BinaryReader
, y BinaryWriter
un objeto, un Stream
objeto requerido como argumento. Tal como:
new BinaryReader(myStream);
De hecho, estos dos tipos se convierten principalmente entre tipos básicos y bytes sin procesar, por lo que deben lidiar con algunos Stream
objetos básicos que pueden realizar E / S en bytes , como FileStream o MemoryStream
. Ambos tipos tienen un BaseStream
atributo a través del cual se puede obtener Stream
una referencia al objeto básico . Los siguientes son BinaryWriter
algunos métodos de la clase:
BinaryReader
con BinaryWriter
funciones muy similares, existen múltiples ReadXXX()
métodos con diferentes nombres . Por ejemplo, BinaryWriter
puede haber Write(Int16)
métodos y Write(Char)
métodos en, pero BinaryReader
solo ReadInt16()
métodos y ReadChar()
métodos en zhong. Porque, al realizar una operación de escritura, el objeto escritor puede inferir lo que está escrito en base a los parámetros de Write (); al realizar una operación de lectura, frente a cada flujo de bytes, el objeto lector no sabe cómo tratar estos bytes. Organizados juntos. Debe llamar a una función específica para poder decirle al objeto lector cómo organizar el flujo de bytes juntos.
2. Entrada / salida binaria con Stream
BinaryReader
Y BinaryWriter
se Stream
puede empaquetar para ingresar / generar datos binarios sin procesar.
Por ejemplo, escriba datos en un archivo en formato binario y luego lea los datos del archivo:
using System;
using System.IO;
class Test
{
static void Main(){
try {
FileStream ds = new FileStream("test_binary.dat", FileMode.Create, FileAccess.ReadWrite);
BinaryWriter bw = new BinaryWriter(ds);
// Write some data to the stream;
bw.Write("A string");
bw.Write(142);
bw.Write(97.4);
bw.Write(true);
// Open it for reading;
BinaryReader br = new BinaryReader(ds);
// Move back to the start;
br.BaseStream.Seek(0, SeekOrigin.Begin);
// Read the data
Console.WriteLine(br.ReadString());
Console.WriteLine(br.ReadInt32());
Console.WriteLine(br.ReadDouble());
Console.WriteLine(br.ReadBoolean());
} catch (Exception e) {
Console.WriteLine("Exception:" + e.ToString());
}
}
}
En el ejemplo, se crea un FileStream
objeto para operar en el archivo. El segundo parámetro al crear un objeto determina cómo se abre el archivo, en este ejemplo, es FileMode.Create
, que significa crear un nuevo archivo o sobrescribir un archivo existente con el mismo nombre. El tercer parámetro determina los permisos de acceso del archivo, utilizado en este ejemplo FileAccess.ReadWrite
, para leer y escribir el archivo.
FileStream
Puede realizar operaciones por su cuenta, lo que generalmente es un inconveniente, por lo que a FileStream
menudo se empaqueta en otras clases que pueden convertir bytes. Como arriba, BinaryWriter
se usa una clase que puede recibir .NET
el tipo original en la clase y convertirlo en bytes. Luego transfiera los bytes a la FileStream
clase.
El programa luego crea un BinaryReader
objetivo para los FileStream
datos leídos. Antes de usarlo BinaryReader
, primero debe volver al principio del archivo, es decir, llamar Seek()
al método FileStream
para reubicar y luego leer los datos del archivo.
3. Utilice la función binaria de File
.NET Framework
Se proporciona una clase de archivo especial para manejar funciones relacionadas con archivos. Es File
una clase de herramienta y una static
clase. Simplemente use " File.方法
" directamente .
Entre estos métodos, uno es obtener un flujo para una operación conveniente, como File.Create(path)
crear o abrir uno FileStream
, y File.OpenRead(path)
obtener uno FileStream
para leer y File.OpenWrite(path)
otro FileStream
para escribir.
El otro tipo es más conveniente. Solo hay una forma de abrir, leer y escribir y cerrar archivos, que incluye:
- ①
File. ReadAlIBytes(path)
Leer todos los bytes de un archivo y devolver una matriz de bytes; - ②Escriba la
File. WriteAllBytes(path,bytes)
matriz de bytes en un archivo; - ③
File. Copy(path,path2)
Copiar archivos.
Serialización y deserialización
1. ¿Qué es la serialización de objetos?
Los objetos de C # generalmente se encuentran en la memoria, pero en aplicaciones reales, a menudo es necesario guardar (persistente) el objeto especificado después de que el programa de C # deja de ejecutarse y volver a leer el objeto guardado en el futuro. La serialización de objetos de C # (serializar), deserializar (deserializar) puede lograr esta función.
Al utilizar la serialización de objetos, cuando el objeto se guarda en el disco o se envía a la red, su estado se guardará como un conjunto de bytes y estos bytes se convertirán en objetos en el futuro (deserialización). Además de la serialización de objetos cuando persisten objetos, la serialización de objetos también se usa cuando se usan llamadas a métodos remotos (como Remoting
, WebService
etc.) o se transfieren objetos a través de la red. Además, también puede serializar y deserializar un objeto para obtener una copia del objeto.
2. Serialización y deserialización simples
System.Runtime.Serialization
El espacio de nombres proporciona funciones de serialización y serialización de objetos. Siempre que una clase esté marcada con [Serializable]
esta característica ( Attribute
), se puede serializar. Para realizar operaciones de serialización y deserialización, necesita un IFormatter
objeto implementado IFormatter
con métodos Serialize(stream, object)
y Deserialize(stream)
. .NET Framework
Los siguientes objetos IFormatter se han implementado en.
- ①
BinaryFormatter
, formato binario, puede serializar objetos en información binaria, utilizado principalmente para la preservación del estado del objeto (como el estado del juego), llamada remota (Remoting), se caracteriza por una alta eficiencia, pero solo se puede.NET Framework
deserializar en la plataforma. Esto requiereSystem.Runtime.Serialization.Formatters.Binary
espacios de nombres. - ② El
XMLDeserialize
formato XML puede serializar objetos en información XML estandarizada, que se utiliza principalmente para la preservación del estado de los objetos y el intercambio de datos.Su característica es que puede intercambiar datos con lenguajes en otras plataformas. Cabe señalar que aquí no se usaIFormatter
, sinoSystem.XML.Serialization
laXmlSerializer
clase en el espacio de nombres , que también tieneSerialize()
yDeserialize()
métodos. - ③ SoapFormatter, SOAP es un formato de llamada de servicio remoto XML Web Service, utilizado principalmente para XML Web Service, existen herramientas especiales en Visual Studio para procesar automáticamente.
Ejemplo, serialización en formato binario y XML:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
[Serializable]
public class Person
{
public string Name {
get; set; }
public int Age {
get; set; }
public Person() {
}
public Person(string name, int age) {
this.Name = name;
this.Age = age;
}
public override string ToString() {
return Name + "(" + Age + ")";
}
}
public class SerializeDemo
{
public static void TestMain() {
Person[] people = {
new Person("李明", 18),
new Person("王强", 19),
};
// 二进制序列化
BinaryFormatter binary = new BinaryFormatter();
string fileName = "s.temp";
BinarySerialize(binary, fileName, people);
// 二进制反序列化
Person[] people1 = BinaryDeserialize(binary, fileName) as Person[];
foreach (Person p in people1)
Console.WriteLine(p);
// XML序列化
XmlSerializer xmlser = new XmlSerializer(typeof(Person[]));
string xmlFileName = "s.xml";
XmlSerializer(xmlser, xmlFileName, people);
// 显示XML文本
string xml = File.ReadAllText(xmlFileName);
Console.WriteLine(xml);
}
private static void BinarySerialize(IFormatter formatter, string fileName, object obj) {
FileStream fs = new FileStream(fileName, FileMode.Create);
formatter.Serialize(fs, obj);
fs.Close();
}
private static object BinaryDeserialize(IFormatter formatter, string fileName) {
FileStream fs = new FileStream(fileName, FileMode.Open);
object obj = formatter.Deserialize(fs);
fs.Close();
return obj;
}
private static void XmlSerializer(XmlSerializer ser, string fileName, object obj) {
FileStream fs = new FileStream(fileName, FileMode.Create);
ser.Serialize(fs, obj);
fs.Close();
}
}
resultado de la operación:
李明(18)
王强(19)
<?xml version="1.0"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Person>
<Name>李明</Name>
<Age>18</Age>
</Person>
<Person>
<Name>王强</Name>
<Age>19</Age>
</Person>
</ArrayOfPerson>