Я хочу сериализовать объекты в строки и обратно.
Мы используем protobuf-net, чтобы успешно превратить объект в поток и обратно.
Тем не менее, Stream для строки и обратно ... не так успешно. После прохождения StreamToString
и StringToStream
, новое Stream
не десериализовано protobuf-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);
c#
.net
serialization
deserialization
protobuf-net
flipuhdelphia
источник
источник
Ответы:
Это так часто, но так глубоко неправильно. Данные Protobuf не являются строковыми данными. Это конечно не ASCII. Вы используете кодирование в обратном направлении . Передача кодировки текста:
У вас нет "отформатированных байтов". У вас есть произвольные байты . Вам нужно использовать что-то вроде base-n (обычно: base-64) кодирования. Это переводы
посмотрите на Convert.ToBase64String и Convert. FromBase64String
источник
BinaryFormatter
, похожий на этот странный пример ?Я только что проверил это и работает отлично.
Если
stream
это уже было написано, вы, возможно, захотите начать сначала, прежде чем прочитать текст:stream.Seek(0, SeekOrigin.Begin);
источник
преобразование MemoryStream в строку: UTF8:
источник
var array = stream.ToArray(); var str = Encoding.UTF8.GetString(array, 0, array.Length);
, См. Также msdn.microsoft.com/en-us/library/…ToArray()
выделяет новый массив в памяти и копирует данные из буфера, что может иметь серьезные последствия, если вы имеете дело с большим количеством данных.При тестировании попробуйте использовать
UTF8
поток кодирования, как показано нижеисточник
Попробуй это.
источник
Я написал полезный метод для вызова любого действия, которое принимает
StreamWriter
и записывает его вместо строки. Метод похож на это;И вы можете использовать это так;
Я знаю, что это можно сделать намного проще с помощью
StringBuilder
, дело в том, что вы можете вызвать любой метод, который принимаетStreamWriter
.источник
В отличие от других ответов, но наиболее простым способом сделать это для большинства типов объектов является XmlSerializer:
Все ваши открытые свойства поддерживаемых типов будут сериализованы. Даже некоторые структуры коллекций поддерживаются и будут туннелировать до свойств подобъекта. Вы можете контролировать, как сериализация работает с атрибутами в ваших свойствах.
Это не работает со всеми типами объектов, некоторые типы данных не поддерживаются для сериализации, но в целом это довольно мощный инструмент, и вам не нужно беспокоиться о кодировании.
источник
В случае, когда вы хотите сериализовать / десериализовать POCO, JSON-библиотека Newtonsoft действительно хороша. Я использую его для сохранения POCO в SQL Server в виде строк JSON в поле nvarchar. Предостережение заключается в том, что, поскольку он не является истинной де / сериализацией, он не будет сохранять частные / защищенные члены и иерархию классов.
источник