Преобразовать BinarySerialized Byte Array в читаемую строку - PullRequest
0 голосов
/ 19 декабря 2018

Когда вы двоично сериализуете объект в .Net с помощью BinaryFormatter, вы получаете байтовый массив, который явно бессмыслен для людей.

Соответствует ли этот байтовый массив более значимому строковому представлению, которое читается человеком?Или вам нужно полностью десериализовать его, чтобы сделать его более читабельным для человека?

Я бы ожидал, что двоичный форматировщик имеет некоторое промежуточное строковое представление объекта, который он использует, перед тем как выдать байтовый массив.Это было бы идеально для моих нужд ...

Я пробовал Base64, кодирующий массив байтов, но я только что получил бред.

РЕДАКТИРОВАТЬ:

Как объяснено в моемответ, кодировка UTF8 - лучшее, что вы можете получить.

Причина, по которой я хочу это сделать, заключается в том, чтобы я мог преобразовывать две двоичные антенны и сохранять только первую сериализацию и разницу, и мне было интересно посмотреть, как сериализацияработал для того, чтобы выяснить, как лучше развести массив байтов.

1 Ответ

0 голосов
/ 19 декабря 2018

Как анализировать содержимое потока двоичной сериализации? более подробно обсуждает формат двоичной сериализации, а также имеет ссылку на своего рода анализатор.

Нет полностью человеческогочитаемое промежуточное представление, но использование Console.WriteLine(System.Text.Encoding.UTF8.GetString(bytes)); вернет что-то, что может быть работоспособным, в зависимости от конкретных целей, для которых оно необходимо.

Обратите внимание, что только некоторые байты могут быть декодированы с использованием UTF8, как только части байтового массивав кодировке UTF8.В результирующей строке будет много unound-symbold.

В качестве примера сериализации следующего и преобразования результата в строку UTF8:

namespace MyNamespace
{
    [Serializable]
    public class Class
    {
        private readonly int _int = 42;

        public string String { get; } = "MyString";
    }
}

приводит к:

"    ????          ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   MyNamespace.Class   _int<String>k__BackingField   *    MyString"

Что не совсем бесполезно ...

...