C#スタディノートバイナリ入力と出力

1.BinaryReaderクラスとBinaryWriterクラス

BinaryReaderそしてBinaryWriter(例えば、基本データ型読み書きする、バイナリ入力/出力、のために使用することができるintdouble等)の代わりに、元のバイトタイプ。BinaryReaderまた、クラスのサブクラスでBinaryWriterはありませんが、構成内のフローパッケージであり引数として必要なオブジェクトであるオブジェクトですといった:StreamStreamBinaryReaderBinaryWriterStream

	new BinaryReader(myStream);

実際、これら2つのタイプは主に基本タイプとrawバイトの間で変換されるため、StreamFileStreamやなどのバイトI / Oを実行できるいくつかの基本オブジェクトを処理する必要がありますMemoryStreamどちらのタイプにもBaseStream、基本Streamオブジェクトへの参照を取得できる属性があります以下は、BinaryWriterいくつかのメソッドクラス:
ここに画像の説明を挿入
BinaryReaderBinaryWriter非常に類似した機能、複数あるReadXXX()方法の異なる名前を持ちますたとえば、BinaryWriterにはWrite(Int16)メソッドとWrite(Char)メソッドがありますが、zhongにはメソッドとメソッドBinaryReaderしかありません書き込み操作を実行するとき、ライターオブジェクトはWrite()のパラメーターに基づいて何が書き込まれたかを推測できるため、読み取り操作を実行するとき、各バイトストリームに直面して、リーダーオブジェクトはこれらのバイトの処理方法を知りません。一緒に組織されました。バイトストリームをまとめる方法をリーダーオブジェクトに指示できるようにするには、特定の関数を呼び出す必要があります。ReadInt16()ReadChar()

2.ストリームを使用したバイナリ入力/出力

BinaryReaderまた、バイナリの生データを入力/出力BinaryWriterするStreamためにパッケージ化できます。
たとえば、バイナリ形式でファイルにデータを書き込んでから、ファイルからデータを読み取ります。

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());
		}	
	}
}

この例ではFileStream、ファイルを操作するためのオブジェクトが作成されています。オブジェクトを作成するときの2番目のパラメーターは、ファイルを開く方法を決定します。この例ではFileMode.Createはです。これは、新しいファイルを作成するか、同じ名前の既存のファイルを上書きすることを意味します。3番目のパラメーターは、この例FileAccess.ReadWrite使用されている、ファイルの読み取りと書き込みのためのファイルのアクセス許可を決定します。
FileStream自分で操作を実行できますが、これは通常は不便なのでFileStream、バイトを変換できる他のクラスにパッケージ化されることがよくあります。上記のように、BinaryWriterクラス.NET内の元の型を受け取り、それをバイトに変換できるクラスが使用されます。次に、バイトをFileStreamクラスに転送します
次に、プログラムBinaryReaderFileStream読み取られたデータのターゲットを作成します。を使用する前にBinaryReader、まずファイルの先頭に戻る必要があります。つまりSeek()、メソッドFileStream呼び出して再配置してから、ファイルからデータを読み取る必要があります。

3.ファイルのバイナリ関数を使用します

.NET Frameworkファイル関連の関数を処理するために、特別なFileクラスが用意されています。これFileはツールクラスとstaticクラスです。「File.方法」を直接使用するだけです。
これらの方法のうち、1のような、便利な操作のためのストリームを取得することであるFile.Create(path)ものを作成または開くFileStreamと、File.OpenRead(path)1を取得FileStream読んでためにFile.OpenWrite(path)1FileStream書き込みのために。
もう1つのタイプの方が便利です。ファイルを開いたり、読み書きしたり、閉じたりする方法は1つしかありません。これには、次のようなものがあります。

  • File. ReadAlIBytes(path)ファイルのすべてのバイトを読み取り、バイト配列を返します。
  • File. WriteAllBytes(path,bytes)バイト配列をファイルに書き込みます。
  • File. Copy(path,path2)ファイルをコピーします。

シリアル化と逆シリアル化

1.オブジェクトのシリアル化とは

C#オブジェクトは通常、メモリ内にありますが、実際のアプリケーションでは、C#プログラムの実行が停止した後、指定したオブジェクトを保存(永続化)し、保存したオブジェクトを後で再読み取りする必要があります。C#オブジェクトのシリアル化(シリアル化)、逆シリアル化(逆シリアル化)は、この機能を実現できます。
オブジェクトのシリアル化を使用して、オブジェクトがディスクに保存されるか、ネットワークに出力されると、その状態はバイトのセットとして保存され、これらのバイトは将来オブジェクトに変換されます(逆シリアル化)。オブジェクトを永続化するときに、オブジェクトのシリアル化に加えて、オブジェクトのシリアル化はまた、(例えば、時にリモートメソッド呼び出しに使用されるRemotingWebServiceなど)を使用するか、またはオブジェクトがネットワークを介して転送されます。さらに、オブジェクトをシリアル化および逆シリアル化して、オブジェクトのコピーを取得することもできます。

2.単純なシリアル化と逆シリアル化

System.Runtime.Serialization名前空間は、オブジェクトのシリアル化およびシリアル化機能を提供します。クラスが[Serializable]この機能(Attribute)でマークされている限り、シリアル化できます。シリアル化および逆シリアル化操作を実行するにメソッドを使用して実装されたIFormatterオブジェクトが必要です。次のIFormatterオブジェクトがに実装されています。IFormatterSerialize(stream, object)Deserialize(stream).NET Framework

  • BinaryFormatter、バイナリ形式は、オブジェクトをバイナリ情報にシリアル化できます。主にオブジェクトの状態の保存(ゲームの状態など)、リモートコール(リモート処理)に使用され、効率が高いという特徴があり.NET Frameworkますが、プラットフォームでのみ逆シリアル化できます。これにはSystem.Runtime.Serialization.Formatters.Binary名前空間が必要です。
  • ②XMLXMLDeserializeフォーマットは、オブジェクトを標準化されたXML情報にシリアル化できます。これは、主にオブジェクトの状態の保存とデータ交換に使用されます。その特徴は、他のプラットフォームの言語とデータを交換できることです。ここでは使用されていませんIFormatterSystem.XML.Serialization、名前空間内のXmlSerializerクラスSerialize()Deserialize()メソッドも含まれていることに注意してください
  • ③SoapFormatter、SOAPはXML Webサービスのリモートサービス呼び出しの形式であり、主にXML Webサービスに使用されます。VisualStudioには、自動的に処理するための特別なツールがあります。

例、バイナリおよび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();
	}
}

演算結果:

李明(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>

おすすめ

転載: blog.csdn.net/qq_45349225/article/details/114401197
おすすめ