Tag: 二进制序列化

如何使用protobuf-net或其他序列化程序序列化第三方类型?

我有List但是protobuf-net给了我错误,它没有合同。 当我没有源时,如何为它指定合约? 它实际上说它无法推断出类型,但我认为这是因为我没有使用它的属性,对吗? 默认的二进制序列化程序也会抱怨,因为类型未标记为可序列化。 编辑:错误消息是: Type is not expected, and no contract can be inferred: HtmlAgilityPack.HtmlNode

反序列化通用列表返回null

我正在/像这样对一个对象进行序列化: public class myClass : ISerializable { public List value; public myClass(SerializationInfo info, StreamingContext context) { this.value = (List)info.GetValue(“value”, typeof(List)); } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue(“value”, value, typeof(List)); } } 列表中的对象具有Seri​​alizable属性。 序列化时,不会抛出任何错误,列表永远不会为空,但是当反序列化我的所有列表都为空时,我不知道为什么。 我将此标记为CQ的回答。 我能够生成一个小的测试应用程序,它正确地使用我正在尝试使用的对象进行序列化/反序列化但我仍然无法让它在我的生产代码中工作,但我怀疑它是小的我我失踪了。

如何忽略二进制序列化的Event类成员?

我需要避免序列化Event类成员,因为当事件由未标记为Serializable的对象处理时,序列化将失败。 我尝试在Event类成员上使用NonSerialized属性,但无法编译。 这行代码: Public Event PropertyValueChanged() 产生以下错误: 属性’NonSerializedAttribute’不能应用于’PropertyValueChanged’,因为该属性在此声明类型上无效。 Public Event PropertyValueChanged() ‘ compiles but needs the extra handling described below 有没有其他方法可以避免序列化活动成员? 如果事件未被处理,这不是问题,我可以通过在序列化之前克隆对象(并忽略事件)来解决它。 只是想知道是否有更好的方法。 谢谢。

条件C#二进制序列化

我正在使用BinaryFormatter按条件序列化类及其变量。 例如: [Serializable] public class Class1 { private Class2 B; … } [Serializable] public class Class2{…} 我希望变量B仅在远程处理时序列化,而不是在我将其序列化为文件存储时序列化。 问题: 1)我知道在XmlSerialization中我们可以使用[XmlIgnore]和{PropertyName} Specified来有条件地忽略该属性。 这是[NonSerialized]的等效方法吗? 2)对于具有[Serializable]属性的类,如何在运行时忽略它?

我应该何时在.NET框架中使用XML序列化与二进制序列化?

我很困惑 – 我应该何时使用XML序列化,何时应该在.NET框架中使用二进制序列化?

BinaryFormatter.Deserialize如何创建新对象?

当BinaryFormatter将流反序列化为对象时,它似乎在不调用构造函数的情况下创建新对象。 它是怎么做到的? 为什么? .NET中还有什么可以做到的吗? 这是一个演示: [Serializable] public class Car { public static int constructionCount = 0; public Car() { constructionCount++; } } public class Test { public static void Main(string[] args) { // Construct a car Car car1 = new Car(); // Serialize and then deserialize to create a second, identical car MemoryStream stream = […]

如何为二进制格式化程序创建SerializationBinder,以处理类型从一个程序集和名称空间到另一个程序集和名称空间的移动

背景如下 我想通过将代码移动到不同的项目来重构代码 其中一些代码包含可序列化的DTO,用于跨多个端点发送和接收数据 如果我移动代码,序列化中断(因此它不能与我的应用程序的旧版本向后兼容) 这个问题的解决方案是SerializationBinder,它允许我在某种意义上从一种类型“重定向”到另一种类型。 因此,我想创建一个SerializationBinder来满足这种需求。 但必须满足以下要求 SerializationBinder的输入应该是旧类型到新类型映射的列表。 映射应包括旧程序集名称(无版本,无公钥标记)和类型的旧全名(名称空间和名称)以及新程序集名称和类型的新全名 对于输入中的类型,应忽略程序集的版本号 如果我的类型碰巧在generics(List,Dictionary等)中而不需要在输入中包含generics,它应该处理generics 对于不在输入中的任何内容(例如,未移动的类型或类似数据集的.NET类型),它应该默认使用二进制序列化器的开箱即用算法 这可能还是我在做梦? 有什么东西已经做到了吗? 我认为这是一个常见的问题。 到目前为止,我认为没有简单的方法可以做到3而且根本没有做到4。 这是一次尝试 public class SmartDeserializationBinder : SerializationBinder { /// /// Private class to handle storing type mappings /// private class TypeMapping { public string OldAssemblyName { get; set; } public string OldTypeName { get; set; } public string NewAssemblyName { […]

如何分析二进制序列化流的内容?

我正在使用二进制序列化(BinaryFormatter)作为临时机制,将状态信息存储在一个相对复杂(游戏)对象结构的文件中; 文件比我预期的要大得多,我的数据结构包括递归引用 – 所以我想知道BinaryFormatter是否实际存储了相同对象的多个副本,或者我的基本“对象和值的数量是否应该有“arithmentic是偏离基础的,或者其他地方的过度规模来自于。 搜索堆栈溢出我能够找到Microsoft的二进制远程格式的规范: http : //msdn.microsoft.com/en-us/library/cc236844( PROT.10) .aspx 我找不到的是任何现有的查看器,它使您能够“窥视”二进制格式化输出文件的内容 – 获取文件中不同对象类型的对象计数和总字节数等; 我觉得这一定是我的“google-fu”让我失望(我什么都没有) – 任何人都可以帮忙吗? 这一定是以前做过的,对吧? 更新 :我找不到它并且没有得到答案所以我把一些相对较快的东西放在一起(链接到下面的可下载项目); 我可以确认BinaryFormatter不存储同一对象的多个副本,但它确实向流中打印了大量元数据。 如果您需要高效存储,请构建自己的自定义序列化方法。

当你没有类的源代码时,是否可以对对象进行.NET二进制序列化?

我正在使用BinaryFormatter对C#中的某些对象进行二进制序列化。 但是,某些对象包含我通过DLL访问但没有源代码的类,因此我无法使用Serializable属性标记它们。 是否有一种简单的方法来序列化它们? 我有一个解决方法,涉及获取类NoSource并创建一个新类SerializableNoSource ,构造函数接受一个NoSource对象并NoSource提取我需要的所有信息,但它很糟糕。 还有更好的选择吗?