我想对对象进行二进制序列化,并将结果保存到数据库中.
Person person = new Person();
person.Name = "something";
MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);
Run Code Online (Sandbox Code Playgroud)
如何将字符串类型中的memorystream转换为保存在数据库中,之后能够反序列化对象?
我有一个项目使用BinaryFormatter序列化字符串和bool的结构集合?数据类型.
序列化/反序列化工作正常,但是如果我要更改执行工作的程序集,则无法反序列化,因为二进制文件中的标头指示它需要Assembly x而不是Assembly y处理数据.
是否可以将序列化/反序列化设置为与程序集无关?
无法反序列化以下对象图.在BinaryFormmater上调用deserialize方法时发生异常:System.Runtime.Serialization.SerializationException:
The constructor to deserialize an object of type 'C' was not found.
Run Code Online (Sandbox Code Playgroud)
C上有两个构造函数,我认为问题可能是:序列化Binaryformatter使用参数化和反序列化过程,它需要一个无参数化的.有黑客/解决方案吗?对象:
[Serializable]
public class A
{
B b;
C c;
public int ID { get; set; }
public A()
{
}
public A(B b)
{
this.b = b;
}
public A(C c)
{
this.c = c;
}
}
[Serializable]
public class B
{
}
[Serializable]
public class C : Dictionary<int, A>
{
public C()
{
}
public C(List<A> list)
{
list.ForEach(p => this.Add(p.ID, p));
}
}
Run Code Online (Sandbox Code Playgroud)
//序列化成功 …
我想知道BinaryFormatter的序列化格式是什么.我发现这个网站提供了一些很好的信息,但它是通过逆向工程获得的,并不完整.
我在哪里可以找到BinaryFormatter序列化格式的官方规范?
我正在使用BinaryFormatter将类实例数组序列化为文件.我可以在同一个应用程序中反序列化这个罚款.当我在不同的应用程序中尝试相同的反序列化(拉入一个执行工作的公共文件)时,我收到以下错误:
{"Could not load file or assembly 'pmlscan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest."}
Run Code Online (Sandbox Code Playgroud)
其中pmlscan是原始应用程序的名称.如何让BinaryFormatter不尝试加载pmlscan?
当使用a序列化以下类时BinaryFormatter,任何订阅该Roar事件的对象也将被序列化,因为对这些对象的引用由EventHandler委托保存.
[Serializable]
public class Lion
{
public event EventHandler Roar;
public string Name { get; set; }
public float Fluffiness { get; set; }
public Lion(string name, float fluffiness)
{
Name = name;
Fluffiness = fluffiness;
}
public void Poke()
{
Roar(); // Could be null, etc..
}
}
Run Code Online (Sandbox Code Playgroud)
从Lion开始,您如何阻止事件订阅者被序列化为对象图的一部分?
将[NonSerializable]属性放在event将不会编译.
注意:我正在回答我自己的问题,因为我认为在网站上获取信息可能会有用!
常见问题解答:提问和回答你自己的问题也很好,但假装你正在使用Jeopardy:用问题的形式说出来.
BinaryFormatter序列化的128³双倍阵列,占用50 MB的空间.序列化128个结构的数组有两个双字段需要150 MB,处理时间超过20秒.
是否有快速简单的替代品可以生成压缩文件?我的期望是上面的例子分别占用16和32 MB,并且在两秒钟内处理.我看了一下protobuf-net,但看起来它甚至不支持struct数组.
PS:我为记录文件大小时出错而道歉.BinaryFormatter的实际空间开销并不大.
我得到了:
System.Runtime.Serialization.SerializationException:无法找到程序集'myNameSpace,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
当试图反序列化另一个程序中的某些数据而不是我用它序列化的程序时.
经过一些谷歌搜索,我发现显然这只能使用共享程序集完成.
但是,我的数据库已满了这个序列化对象,我需要一个实用程序来解决它们.有没有办法覆盖这种行为,只是提供完全相同的类,并强制它反序列化?
我已经找到了这个片段,但我不明白应该如何以及在哪里放置/使用它.
static constructor() {
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
Assembly ayResult = null;
string sShortAssemblyName = args.Name.Split(',')[0];
Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ayAssembly in ayAssemblies) {
if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0]) {
ayResult = ayAssembly;
break;
}
}
return ayResult;
}
Run Code Online (Sandbox Code Playgroud) 我有一个标记为Serializable的简单类,它碰巧有一个事件.我试图将事件成员标记为NonSerialized,但编译器抱怨.然而,当我去序列化类实例时,BinaryFormatter会抛出一个异常,即事件是不可序列化的.这是否意味着您无法序列化具有事件的类?如果是这样,那么编译器应该事先说出来.
Stream file = File.Open("f", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
object obj = null;
try
{
obj = bf.Deserialize(file);
}
catch (System.Runtime.Serialization.SerializationException e)
{
MessageBox.Show("De-Serialization failed : {0}", e.Message);
}
file.Close();
System.Collections.ArrayList nodeList = obj as System.Collections.ArrayList;
foreach (TreeNode node in nodeList)
{
treeView.Nodes.Add(node);
}
Run Code Online (Sandbox Code Playgroud)
无法在以下类上工作:
[Serializable()]
class Simple
{
private int myInt;
private string myString;
public event SomeOtherEventDefinedElsewhere TheEvent;
Run Code Online (Sandbox Code Playgroud)
}
我有一个二进制文件,我想混淆和分发给用户.让我们假设我使用我的二进制文件的未经模糊处理的版本来使用现成的.NET二进制格式化程序来序列化数据.那么我们可以用混淆的二进制文件对数据进行语义化吗?
我想发布混淆的二进制文件和序列化数据.如果上述问题的答案是肯定的,我可以在用户之间共享序列化数据.否则,我将不得不向每个用户提供单独的序列化数据.