сделать строковые свойства нечитаемыми после сериализации объекта

Я использую этот код для сериализации своих объектов

public static void SerializeObject(string filename, MyObject objectToSerialize)
{
    Stream stream = File.Open(filename, FileMode.Create);
    BinaryFormatter bformatter = new BinaryFormatter();

    bformatter.Serialize(stream, objectToSerialize);
    stream.Close();            
}

Сериализация и десериализация работают нормально, но мне интересно, как я могу с помощью сериализации сделать строковые свойства объектов нечитаемыми. Теперь после сериализации, когда пользователь открывает файл в текстовом редакторе, строковые свойства читаются между другими уродливыми символами.


person user1765862    schedule 30.09.2014    source источник


Ответы (1)


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

Так, например, при сохранении строки он может добавлять к необработанной строке префикс длины строки в виде двоичного 32-битного числа, что приведет к 4 байтам, которые не представляют символы (и будут показывать «уродливые символы» в Текстовый редактор).

Если вам нужна удобочитаемая сериализованная версия, вы должны использовать сериализацию XML.

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

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml;
using System.Xml.Serialization;

namespace Demo
{
    [Serializable]
    public class Test
    {
        public string Text;
        public int    Number;
    }

    internal class Program
    {
        private static void Main()
        {
            var test = new Test {Text = "Some text", Number = 12345 };

            // Creates a binary file:

            using (var stream = File.Create(@"c:\\test\\test.bin"))
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(stream, test);
            }

            // Creates an XML file using XmlSerializer:

            using (var stream = File.Create(@"c:\\test\\test1.xml"))
            {
                var formatter = new XmlSerializer(typeof(Test), defaultNamespace : "");
                formatter.Serialize(stream, test);
            }

            // Creates an XML file using XmlWriter and DataContractSerializer:

            DataContractSerializer serializer = new DataContractSerializer(test.GetType());

            using (var streamWriter = File.CreateText(@"c:\\test\\test2.xml"))
            using (var xmlWriter    = XmlWriter.Create(streamWriter, new XmlWriterSettings { Indent = true }))
            {
                serializer.WriteObject(xmlWriter, test);
            }
        }
    }
}
person Matthew Watson    schedule 30.09.2014
comment
Это не отвечает на вопрос. Он спросил, как я могу с помощью сериализации сделать строковые свойства объектов нечитаемыми. - person Vinod Srivastav; 01.06.2019
comment
@VinodSrivastav ОП на самом деле спрашивал, как сделать свойства ЧИТАЕМЫМИ без каких-либо уродливых символов, но явно его английский был не слишком хорош. - person Matthew Watson; 03.06.2019