Notas de estudio de C # entrada y salida binarias

1.Clase BinaryReader y clase BinaryWriter

BinaryReaderY BinaryWriterse puede utilizar para entrada / salida binaria, es decir, para leer y escribir tipos de datos básicos (como int, doubleetc.) en lugar de los tipos de bytes originales. BinaryReaderY BinaryWriterno es una Streamsubclase de la clase, pero es un Streampaquete de flujo, en la configuración BinaryReader, y BinaryWriterun objeto, un Streamobjeto 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 Streamobjetos básicos que pueden realizar E / S en bytes , como FileStream o MemoryStream. Ambos tipos tienen un BaseStreamatributo a través del cual se puede obtener Streamuna referencia al objeto básico . Los siguientes son BinaryWriteralgunos métodos de la clase:
Inserte la descripción de la imagen aquí
BinaryReadercon BinaryWriterfunciones muy similares, existen múltiples ReadXXX()métodos con diferentes nombres . Por ejemplo, BinaryWriterpuede haber Write(Int16)métodos y Write(Char)métodos en, pero BinaryReadersolo 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

BinaryReaderY BinaryWriterse Streampuede 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 FileStreamobjeto 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.
FileStreamPuede realizar operaciones por su cuenta, lo que generalmente es un inconveniente, por lo que a FileStreammenudo se empaqueta en otras clases que pueden convertir bytes. Como arriba, BinaryWriterse usa una clase que puede recibir .NETel tipo original en la clase y convertirlo en bytes. Luego transfiera los bytes a la FileStreamclase.
El programa luego crea un BinaryReaderobjetivo para los FileStreamdatos leídos. Antes de usarlo BinaryReader, primero debe volver al principio del archivo, es decir, llamar Seek()al método FileStreampara reubicar y luego leer los datos del archivo.

3. Utilice la función binaria de File

.NET FrameworkSe proporciona una clase de archivo especial para manejar funciones relacionadas con archivos. Es Fileuna clase de herramienta y una staticclase. 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 FileStreampara leer y File.OpenWrite(path)otro FileStreampara 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, WebServiceetc.) 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.SerializationEl 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 IFormatterobjeto implementado IFormattercon métodos Serialize(stream, object)y Deserialize(stream). .NET FrameworkLos 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 Frameworkdeserializar en la plataforma. Esto requiere System.Runtime.Serialization.Formatters.Binaryespacios de nombres.
  • ② El XMLDeserializeformato 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 usa IFormatter, sino System.XML.Serializationla XmlSerializerclase en el espacio de nombres , que también tiene Serialize()y Deserialize()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>

Supongo que te gusta

Origin blog.csdn.net/qq_45349225/article/details/114401197
Recomendado
Clasificación