1.BinaryReaderクラスとBinaryWriterクラス
BinaryReader
そしてBinaryWriter
(例えば、基本データ型読み書きする、バイナリ入力/出力、のために使用することができるint
、double
等)の代わりに、元のバイトタイプ。BinaryReader
また、クラスのサブクラスでBinaryWriter
はありませんが、構成内のフローパッケージであり、引数として必要なオブジェクトであるオブジェクトです。といった:Stream
Stream
BinaryReader
BinaryWriter
Stream
new BinaryReader(myStream);
実際、これら2つのタイプは主に基本タイプとrawバイトの間で変換されるため、Stream
FileStreamやなどのバイトでI / Oを実行できるいくつかの基本オブジェクトを処理する必要がありますMemoryStream
。どちらのタイプにもBaseStream
、基本Stream
オブジェクトへの参照を取得できる属性があります。以下は、BinaryWriter
いくつかのメソッドのクラス:
BinaryReader
とBinaryWriter
非常に類似した機能、複数ある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
クラスに転送します。
次に、プログラムBinaryReader
はFileStream
読み取られたデータのターゲットを作成します。を使用する前に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#オブジェクトのシリアル化(シリアル化)、逆シリアル化(逆シリアル化)は、この機能を実現できます。
オブジェクトのシリアル化を使用して、オブジェクトがディスクに保存されるか、ネットワークに出力されると、その状態はバイトのセットとして保存され、これらのバイトは将来オブジェクトに変換されます(逆シリアル化)。オブジェクトを永続化するときに、オブジェクトのシリアル化に加えて、オブジェクトのシリアル化はまた、(例えば、時にリモートメソッド呼び出しに使用されるRemoting
、WebService
など)を使用するか、またはオブジェクトがネットワークを介して転送されます。さらに、オブジェクトをシリアル化および逆シリアル化して、オブジェクトのコピーを取得することもできます。
2.単純なシリアル化と逆シリアル化
System.Runtime.Serialization
名前空間は、オブジェクトのシリアル化およびシリアル化機能を提供します。クラスが[Serializable]
この機能(Attribute
)でマークされている限り、シリアル化できます。シリアル化および逆シリアル化操作を実行するには、メソッドを使用して実装されたIFormatter
オブジェクトが必要です。次のIFormatterオブジェクトがに実装されています。IFormatter
Serialize(stream, object)
Deserialize(stream)
.NET Framework
- ①
BinaryFormatter
、バイナリ形式は、オブジェクトをバイナリ情報にシリアル化できます。主にオブジェクトの状態の保存(ゲームの状態など)、リモートコール(リモート処理)に使用され、効率が高いという特徴があり.NET Framework
ますが、プラットフォームでのみ逆シリアル化できます。これにはSystem.Runtime.Serialization.Formatters.Binary
名前空間が必要です。 - ②XML
XMLDeserialize
フォーマットは、オブジェクトを標準化されたXML情報にシリアル化できます。これは、主にオブジェクトの状態の保存とデータ交換に使用されます。その特徴は、他のプラットフォームの言語とデータを交換できることです。ここでは使用されていませんIFormatter
がSystem.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>