구조를 a로 직렬화하고 직렬화 된 구조 MemoryStream
를 저장하고로드하려고합니다.
그렇다면 MemoryStream
파일에 파일 을 저장하고 파일에서 다시로드하는 방법은 무엇입니까?
답변
메모리 스트림의 내용을 다른 스트림에 쓰는 데 MemoryStream.WriteTo
또는 Stream.CopyTo
프레임 워크 버전 4.5.2, 4.5.1, 4.5, 4에서 지원되는 방법을 사용할 수 있습니다 .
memoryStream.WriteTo(fileStream);
최신 정보:
fileStream.CopyTo(memoryStream);
memoryStream.CopyTo(fileStream);
답변
MemoryStream 이름이이라고 가정합니다 ms
.
이 코드는 MemoryStream을 파일에 기록합니다.
using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) {
byte[] bytes = new byte[ms.Length];
ms.Read(bytes, 0, (int)ms.Length);
file.Write(bytes, 0, bytes.Length);
ms.Close();
}
그리고 이것은 파일을 MemoryStream으로 읽습니다.
using (MemoryStream ms = new MemoryStream())
using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read)) {
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
ms.Write(bytes, 0, (int)file.Length);
}
.Net Framework 4 이상에서는 FileStream을 MemoryStream에 복사하고 다음과 같이 간단하게 되돌릴 수 있습니다.
MemoryStream ms = new MemoryStream();
using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read))
file.CopyTo(ms);
그리고 반대로 (MemoryStream to FileStream) :
using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write))
ms.CopyTo(file);
답변
스트림은 예외가있는 경우에도 실제로 처리해야합니다 (파일 I / O에서 매우 빠름). using 절이 가장 좋아하는 접근 방식이므로 MemoryStream을 작성하는 데 다음을 사용할 수 있습니다.
using (FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write)) {
memoryStream.WriteTo(file);
}
그리고 그것을 다시 읽어주기 위해 :
using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read)) {
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
ms.Write(bytes, 0, (int)file.Length);
}
파일이 크면 읽기 작업이 총 파일 크기보다 두 배 많은 메모리를 사용한다는 점에 주목할 가치가 있습니다 . 이에 대한 한 가지 해결책은 바이트 배열에서 MemoryStream을 만드는 것입니다. 다음 코드는 해당 스트림에 쓰지 않을 것이라고 가정합니다.
MemoryStream ms = new MemoryStream(bytes, writable: false);
내 연구 (아래)에 따르면 내부 버퍼는 전달하는 것과 동일한 바이트 배열이므로 메모리를 절약해야합니다.
byte[] testData = new byte[] { 104, 105, 121, 97 };
var ms = new MemoryStream(testData, 0, 4, false, true);
Assert.AreSame(testData, ms.GetBuffer());
답변
짧은 버전을 찾는 사람은 :
var memoryStream = new MemoryStream(File.ReadAllBytes("1.dat"));
File.WriteAllBytes("1.dat", memoryStream.ToArray());
답변
파일에 쓰기위한 결합 된 대답은 다음과 같습니다.
MemoryStream ms = new MemoryStream();
FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write);
ms.WriteTo(file);
file.Close();
ms.Close();
답변
파일로 저장
Car car = new Car();
car.Name = "Some fancy car";
MemoryStream stream = Serializer.SerializeToStream(car);
System.IO.File.WriteAllBytes(fileName, stream.ToArray());
파일에서 불러 오기
using (var stream = new MemoryStream(System.IO.File.ReadAllBytes(fileName)))
{
Car car = (Car)Serializer.DeserializeFromStream(stream);
}
어디
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace Serialization
{
public class Serializer
{
public static MemoryStream SerializeToStream(object o)
{
MemoryStream stream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, o);
return stream;
}
public static object DeserializeFromStream(MemoryStream stream)
{
IFormatter formatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
object o = formatter.Deserialize(stream);
return o;
}
}
}
과
[Serializable]
public class Car
{
public string Name;
}
답변
파일을로드 할 때 나는 이것을 훨씬 좋아합니다.
MemoryStream ms = new MemoryStream();
using (FileStream fs = File.OpenRead(file))
{
fs.CopyTo(ms);
}