使用二进制 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()
我在使用 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()