使用二进制 DataContactSerializer 序列化后如何反序列化?

How to deserialize after serializing with binary DataContactSerializer?

我在使用 default DataContractSerializer 序列化后成功反序列化。

MemoryStream ms = new MemoryStream();
DataContractSerializer dcSerializer = new DataContractSerializer( typeof( Library ) );
dcSerializer.WriteObject( ms, lib );
ms.Position = 0;
var returned = dcSerializer.ReadObject( ms ) as Library;

但是如果我使用二进制编写器和二进制程序reader,这段代码会抛出异常。

MemoryStream ms2 = new MemoryStream();
var binWriter = XmlDictionaryWriter.CreateBinaryWriter( ms2 );
dcSerializer.WriteObject( binWriter, lib );
ms2.Position = 0;
var binReader = XmlDictionaryReader.CreateBinaryReader( ms2, XmlDictionaryReaderQuotas.Max );
// throws an exception
var returned2 = dcSerializer.ReadObject( binReader ) as Library; 

异常消息是

There was an error deserializing the object of type Test.Library.
Unexpected end of file.
Following elements are not closed: Pages, Book, Books, Library.

这里是图书馆 class。

[Serializable]
public class Library
{
    [XmlAttribute, DataMember]
    public string Name;
    [DataMember]
    public Person Owner;
    [XmlAttribute, DataMember]
    public DateTime DateEstablished;
    [DataMember]
    public List<Book> Books;
}

还有这本书 class。

[Serializable]
public class Book
{
    [XmlAttribute, DataMember]
    public string Title, ISBN, Author;
    [XmlAttribute, DataMember]
    public DateTime DatePublished;
    [XmlAttribute, DataMember]
    public int Pages;
    [DataMember]
    public List<string> TableOfContents;
}

我已经在 .net 上设置了一个示例 fiddle。 https://dotnetfiddle.net/wV8VAh

站点上没有 运行,因为它缺少 System.Runtime.Serialization 程序集。但是如果你把它放到一个 Visual Studio 项目中,然后添加程序集,它就会 运行 就好了。 (并抛出异常!)

我错过了什么? 谢谢!

您可能需要在执行 WriteObject 后刷新编写器和流:

binWriter.Flush()