在对象序列化后使字符串属性不可读

时间:2014-09-30 11:33:14

标签: c# .net serialization

我使用this代码来序列化我的对象

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();            
}

序列化和反序列化工作正常,但我想知道如何使用序列化使对象字符串属性变得不可读。现在,在序列化后,当用户在文本编辑器中打开文件时,字符串属性可以在其他丑陋的字符之间读取。

1 个答案:

答案 0 :(得分:0)

这是因为您使用的是BINARY格式化程序,它以二进制形式存储数据。

因此,例如,当存储字符串时,它可以在原始字符串前面加上字符串的长度作为二进制32位数字 - 这将导致4个字节不代表字符(并将显示&#34 ;丑陋的字符"在文本编辑器中)。

如果您需要人类可读的序列化版本,则应使用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);
            }
        }
    }
}