스트림을 문자열로 변환하고 되돌리는 중
개체를 문자열로 직렬화하고 뒤로 이동합니다.
protof-net을 사용하여 객체를 스트림으로 변환하고 성공적으로 되돌립니다.
그러나 문자열로 스트림하고 다시...그다지 성공적이지 못합니다.을 거친 후StreamToString
그리고.StringToStream
신간의Stream
protof-net에 의해 역직렬화되지 않았습니다; 그것은 그것을 제기합니다.Arithmetic Operation resulted in an Overflow
예외.원래 스트림을 역직렬화하면 작동합니다.
방법:
public static string StreamToString(Stream stream)
{
stream.Position = 0;
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
public static Stream StringToStream(string src)
{
byte[] byteArray = Encoding.UTF8.GetBytes(src);
return new MemoryStream(byteArray);
}
다음 두 가지를 사용한 예제 코드:
MemoryStream stream = new MemoryStream();
Serializer.Serialize<SuperExample>(stream, test);
stream.Position = 0;
string strout = StreamToString(stream);
MemoryStream result = (MemoryStream)StringToStream(strout);
var other = Serializer.Deserialize<SuperExample>(result);
저는 방금 이것을 테스트했고 잘 작동합니다.
string test = "Testing 1-2-3";
// convert string to stream
byte[] byteArray = Encoding.ASCII.GetBytes(test);
MemoryStream stream = new MemoryStream(byteArray);
// convert stream to string
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
한다면stream
에 이미 기록되어 있습니다. 텍스트를 읽기 전에 먼저 시작 부분으로 이동하는 것이 좋습니다.stream.Seek(0, SeekOrigin.Begin);
이것은 너무 흔하지만 너무 심각하게 틀렸습니다.데이터의 프로토콜이 문자열 데이터가 아닙니다.그것은 확실히 ASCII가 아닙니다.인코딩을 역방향으로 사용하고 있습니다.텍스트 인코딩 전송:
- 형식이 지정된 바이트에 대한 임의 문자열
- 원래 문자열로 포맷된 바이트
포맷된 바이트가 없습니다.임의 바이트가 있습니다.base-n(일반적으로 base-64) 인코딩과 같은 것을 사용해야 합니다.전송됩니다.
- 형식이 지정된 문자열에 대한 임의 바이트
- 원본 바이트로 포맷된 문자열
보다Convert.ToBase64String
그리고.Convert.FromBase64String
.
UTF8 메모리 스트림을 문자열로 변환:
var res = Encoding.UTF8.GetString(stream.GetBuffer(), 0 , (int)stream.Length)
테스트할 때 사용해 보십시오.UTF8
아래와 같은 스트림 인코딩
var stream = new MemoryStream();
var streamWriter = new StreamWriter(stream, System.Text.Encoding.UTF8);
Serializer.Serialize<SuperExample>(streamWriter, test);
이거 먹어봐요.
string output1 = Encoding.ASCII.GetString(byteArray, 0, byteArray.Length)
StreamReader reader = new StreamReader(strm, System.Text.Encoding.UTF8);
var final1 = reader.ReadToEnd();
대부분의 문제의 주요 원인은 인코딩 유형...여기에 기본적으로 System(시스템)텍스트, 인코딩.UTF8이 문제를 해결했습니다.
즐기세요...
나는 어떤 행동이든 호출할 수 있는 유용한 방법을 썼습니다.StreamWriter
대신 문자열로 작성합니다.방법은 다음과 같습니다.
static void SendStreamToString(Action<StreamWriter> action, out string destination)
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream, Encoding.Unicode))
{
action(writer);
writer.Flush();
stream.Position = 0;
destination = Encoding.Unicode.GetString(stream.GetBuffer(), 0, (int)stream.Length);
}
}
그리고 이렇게 사용할 수 있습니다.
string myString;
SendStreamToString(writer =>
{
var ints = new List<int> {1, 2, 3};
writer.WriteLine("My ints");
foreach (var integer in ints)
{
writer.WriteLine(integer);
}
}, out myString);
저는 이것이 훨씬 더 쉽게 이루어질 수 있다는 것을 압니다.StringBuilder
요점은 당신이 어떤 방법이든 부를 수 있다는 것입니다.StreamWriter
.
개체를 문자열로 직렬화하고 뒤로 이동합니다.
다른 답변과는 다르지만 대부분의 개체 유형에 대해 가장 간단한 방법은 XmlSerializer입니다.
Subject subject = new Subject();
XmlSerializer serializer = new XmlSerializer(typeof(Subject));
using (Stream stream = new MemoryStream())
{
serializer.Serialize(stream, subject);
// do something with stream
Subject subject2 = (Subject)serializer.Deserialize(stream);
// do something with subject2
}
지원되는 유형의 모든 공용 속성이 직렬화됩니다.일부 컬렉션 구조도 지원되며 하위 개체 속성으로 터널링됩니다.속성의 속성에서 직렬화가 작동하는 방식을 제어할 수 있습니다.
이것은 모든 개체 유형에서 작동하지 않으며, 일부 데이터 유형은 직렬화를 지원하지 않지만 전체적으로 매우 강력하며 인코딩에 대해 걱정할 필요가 없습니다.
POCO를 직렬화/직렬화하고 싶은 경우에는 Newtonsoft의 JSON 라이브러리가 정말 좋습니다.SQL Server 내의 POC를 nvarchar 필드의 JSON 문자열로 유지하는 데 사용합니다.주의할 점은 실제 직렬화 해제가 아니므로 개인/보호된 구성원 및 클래스 계층을 보존하지 않는다는 것입니다.
언급URL : https://stackoverflow.com/questions/17801761/converting-stream-to-string-and-back
'programing' 카테고리의 다른 글
표를 설계하는 동안 일대일, 일대일 및 다대다 관계를 구현하는 방법은 무엇입니까? (0) | 2023.05.07 |
---|---|
Git: 추적된 파일 무시 (0) | 2023.05.07 |
Postgre에서 타임스탬프를 자동으로 업데이트하려면 어떻게 합니까?SQL (0) | 2023.05.07 |
VBA(excel)에서 정규식 일치 항목 반환 (0) | 2023.05.07 |
인수가 중간에 있는 PowerShell 별칭을 작성하려면 어떻게 해야 합니까? (0) | 2023.05.07 |