我正在测试BinaryFormatter,看看它对我有用,我有一个简单的问题:
当它与字符串HELLO一起使用时,我将MemoryStream转换为数组,它给出了29个维度,其中五个是维度末尾的实际数据:
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
byte[] bytes;
string originalData = "HELLO";
bf.Serialize(ms, originalData);
ms.Seek(0, 0);
bytes = ms.ToArray();
Run Code Online (Sandbox Code Playgroud)
回报
- bytes {Dimensions:[29]} byte[]
[0] 0 byte
[1] 1 byte
[2] 0 byte
[3] 0 byte
[4] 0 byte
[5] 255 byte
[6] 255 byte
[7] 255 byte
[8] 255 byte
[9] 1 byte
[10] 0 byte
[11] 0 byte
[12] 0 byte
[13] 0 byte
[14] 0 byte
[15] 0 byte
[16] 0 …Run Code Online (Sandbox Code Playgroud) 使用.NET 4/C#...
我需要反序列化包含名为ns1.X的类型的序列化表示的旧配置文件.序列化已经完成了BinaryFormatter.
问题是,经过一轮重构后,类型X已被移动到另一个名称空间,比如ns2.X.
我尝试创建一个从ns2.X派生的新的空ns1.X类型,虽然这绕过了' 找不到类型ns1.X '错误,但反序列化对象中的属性都是null.此外,在此过程中没有调用ctors.
有什么建议?
我有一个使用ADO.NET访问持久存储的旧项目.目前,我想将其迁移到EF(6.1.3,如果重要的话),以便支持几个数据库提供程序,并且代码重复最少.
有一个实体,其中包含Hashtable属性:
public class Record
{
...
public Hashtable data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用ADO.NET,BinaryFormatter用于将此data属性转换为BLOB,反之亦然:
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, data);
result = stream.GetBuffer();
}
//----------
using (MemoryStream serializationStream = new MemoryStream((byte[])value))
{
BinaryFormatter formatter = new BinaryFormatter();
result = (Hashtable)formatter.Deserialize(serializationStream);
}
Run Code Online (Sandbox Code Playgroud)
现在我需要告诉EF它应该如何存储和检索该属性.
我试过了什么
我可以在实体中再存储一个属性:
public class Record
{
public byte[] dataRaw { get; set; }
[NotMapped]
public Hashtable data {
get {/*deserialize dataRaw */ …Run Code Online (Sandbox Code Playgroud) 我正在阅读文章,以了解有关datacontractserializer和binaryformatter序列化器的更多信息.基于到目前为止所做的阅读,我的印象是binaryformatter应该比datacontractserializer的占用空间小.原因是DataContractSerializer序列化为xml信息集,而binaryformatter序列化为专有二进制格式.
以下是测试
[Serializable]
[DataContract]
public class Packet
{
[DataMember]
public DataSet Data { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
DataSet填充了表中的121317行[AdventureWorks].[Sales].[SalesOrderDetail]
using (var fs = new FileStream("test1.txt", FileMode.Create))
{
var dcs = new DataContractSerializer(typeof(Packet));
dcs.WriteObject(fs, packet);
Console.WriteLine("Total bytes with dcs = " + fs.Length);
}
using(var fs = new FileStream("test2.txt", FileMode.Create))
{
var bf = new BinaryFormatter();
bf.Serialize(fs, packet);
Console.WriteLine("Total bytes with binaryformatter = …Run Code Online (Sandbox Code Playgroud) 我有一些我已经序列化的大型对象图,其中一些需要一些时间来反序列化。
在这个阶段,我对我的小“请稍等...”框感到非常满意,它在完成时出现然后消失,但我只是想在反序列化开始时使用某种进度条的想法更长。
似乎没有任何方法可以获取对象的内置Deserialize()方法的进度BinaryFormatter。我怀疑如果包含了这样的功能,就会有某种异步回调,每当从流中读取一个字节块时,它就会进行轮询。
你们中有人看到过类似 ProgressBar 的行为的对象序列化/反序列化的实现吗?
在过去2天搜索到这个问题的答案后,我希望有人可以提供帮助.
我使用VS2012在c#中编写了一个程序,它使用BinaryFormatter保存用户的项目数据,将序列化类序列化为Stream,然后将其保存到文件中.该程序已经使用了一段时间,但是最近用户无法打开他前一天保存的文件.他把文件发给我了,我在degugger中得到的错误是:
"二进制流'0'不包含有效的BinaryHeader.可能的原因是序列化和反序列化之间无效的流或对象版本更改."
鉴于用户在前一天保存了数据,序列化和反序列化之间的基础对象结构或格式没有变化.
之前没有出现过这个问题,导致我认为它必须是非常间歇性的,因此序列化和反序列化的对象没有明显的问题.
我的问题是:
我对这个错误的理解是序列化数据的格式与被反序列化的对象的格式不匹配.它是否正确?还有其他原因吗?
如果是这样,可能导致这种间歇性错误的原因是什么?
有没有办法从这个文件中检索数据,即使BinaryFormatter不认为它的格式正确?
有更安全的方法来保存和加载数据吗?我已经看到XmlFormatter似乎是一个更好的选择,但是这将如何帮助确保保存和调用的数据的完整性?
如果有帮助,我用来序列化/反序列化的代码如下:
//serialize
SEProjectData serializedProject = serializeProjectData();
Stream stream = File.Open(saveFileDialog1.FileName, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, serializedProject);
stream.Close();
//deserialize
Stream stream = File.Open(path, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
SEProjectData projectData = (SEProjectData)bFormatter.Deserialize(stream);
stream.Close();
Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,我需要将图像上传到我的服务器.我想将我的图像的二进制数据存储到数据库中的BLOB数据类型字段.因此,我需要将我的图像转换为二进制格式.这样它就可以保存在服务器数据库中.
那么如何将图像转换为二进制格式?请指教.
我有以下方法来生成对象的散列。它工作得很好!但是当我更改程序集的版本时,即使对象相同,哈希也会发生变化。
public static string GetHash(Object item)
{
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, item);
binaryFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider();
memoryStream.Seek(0, SeekOrigin.Begin);
return Convert.ToBase64String(hashAlgorithm.ComputeHash(memoryStream));
}
Run Code Online (Sandbox Code Playgroud)
怎么可能忽略程序集版本?
我知道已经有很多关于该主题的讨论,例如:
但这看起来非常复杂。我正在寻找一种更简单的方法来将通用对象列表序列化到一个文件中或从一个文件中反序列化。这是我尝试过的:
public void SaveFile(string fileName)
{
List<object> objects = new List<object>();
// Add all tree nodes
objects.Add(treeView.Nodes.Cast<TreeNode>().ToList());
// Add dictionary (Type: Dictionary<int, Tuple<List<string>, List<string>>>)
objects.Add(dictionary);
using(Stream file = File.Open(fileName, FileMode.Create))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(file, objects);
}
}
public void LoadFile(string fileName)
{
ClearAll();
using(Stream file = File.Open(fileName, FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(file);
// Error: ArgumentNullException in System.Core.dll
TreeNode[] nodeList = (obj as IEnumerable<TreeNode>).ToArray();
treeView.Nodes.AddRange(nodeList);
dictionary = obj as …Run Code Online (Sandbox Code Playgroud) 我正在研究.NET Core项目,我正在尝试解析我List<T>的问题byte[].使用.NET Framework,我们可以通过使用来实现相同的目标BinaryFormatter,但在撰写此问题时,看起来Microsoft似乎还没有在.NET Core中支持它,并且似乎没有即将发布的版本.
任何人都可以告诉如何在.NET Core中执行此序列化?此外,依赖于二进制序列化平台,因此在.NET Core中已弃用.
binaryformatter ×10
c# ×8
.net ×2
c#-4.0 ×1
core ×1
image ×1
ios ×1
memorystream ×1
object ×1
progress-bar ×1