【问题标题】:Binary Serialization/Deserialization with dictionaries and others class members使用字典和其他类成员进行二进制序列化/反序列化
【发布时间】:2015-12-20 21:13:41
【问题描述】:

我需要序列化/反序列化具有子类的类,其中成员是字典。另一个成员是存储密码的类,因此它不能是 XML,而是二进制。 发现了一个非常好的解决方案,它可能很容易且没有问题。

http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/

但是这个例子(以及我发现的所有其他例子)有一个 xml 输出,这不是我的问题的正确解决方案。

所以问题是:“如何使用二进制而不是 xml 输出进行数据合同序列化?” 提前感谢

---添加--- 即使使用该类的文件流:

 [DataContract]
 public class MyClass
 {
   // need a parameterless constructor for serialization
   public MyClass()
  {
    MyDictionary = new Dictionary<string, string>();
  }
  [DataMember]
  public Dictionary<string, string> MyDictionary { get; set; }
  public int aaaa = 3;
 }

做事

  MyClass theclass = new MyClass();

  var serializer = new DataContractSerializer(typeof(MyClass));
  bool append = true;
  using (Stream fileStream = File.Open("aaa.bin", append ? FileMode.Append : FileMode.Create))
  {
    serializer.WriteObject(fileStream, theclass);
  }

输出是 XML。

【问题讨论】:

  • DataContractSerializer.WriteObject 有一个接受二进制写入器的重载,您没有使用它 - 请参阅msdn.microsoft.com/en-us/library/ms752244(v=vs.110).aspx。将数据序列化为二进制格式不是一种安全的密码存储方式。
  • 感谢工作正常。为什么不将其作为解决方案发布?

标签: c# wpf dictionary binary-serialization


【解决方案1】:

就像 Preston Guillot 在他的评论中已经提到的那样。 DataContractSerializer.WriteObject 也接受二进制写入器。为了完整起见,这里是一个示例。

MyClass theClass = new MyClass();

var serializer = new DataContractSerializer(typeof(MyClass));
bool append = true;
using (Stream fileStream = File.Open("aaa.bin", append ? FileMode.Append : FileMode.Create))
{
    XmlDictionaryWriter binaryWriter = XmlDictionaryWriter.CreateBinaryWriter(fileStream);
    serializer.WriteObject(binaryWriter, theClass);
    binaryWriter.Flush();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 2010-12-10
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多