Tag: binaryformatter

没有BinaryFormatter 的C#对象到byte ?

BinaryFormatter工作得很好,但在.NET 4.5的Portable类库中不存在。 我已经读过它在.NET 4.6 Portable中。 我还没有确认这一点,因为当我在项目设置中更改为4.6时,我收到一条警告消息“4.5将自动定位”,除非我取消选择Silverlight,WindowsPhone,Windows Universal,Xamarin等),所以我只能目标.NET 4.6便携式,如果我不是针对其他平台,从而打败了目的。 这是我原来的BinarySerializer(Works但不是PCL因为使用了BinaryFormatter ) private string BinarySerialize(object Source) { byte[] serializedObject; using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, Source); serializedObject = stream.ToArray(); } return Convert.ToBase64String(serializedObject); } 那就是说,我开始尝试重新编写我的BinarySerializer以使用PCL中可用的BinaryReader和BinaryWriter ,并遇到以下问题: BinaryWriter ,只能处理简单类型(如string , bool , byte , long , int等)和Streams ,所以我认为我需要找到一种方法将匿名对象转换为Stream 。 我在正确的道路上吗? 你如何转换直到运行时才知道的类型(如System.Delegate – […]

如何提高反序列化速度?

使用BinaryFormatter进行序列化/反序列化,生成的序列化文件大小约为80MB。 反序列化需要几分钟。 我怎么能改进这个? 这是反序列化代码: public static Universe DeserializeFromFile(string filepath) { Universe universe = null; FileStream fs = new FileStream(filepath, FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); try { universe = (Universe)bf.Deserialize(fs); } catch (SerializationException e) { Console.WriteLine(“Failed to deserialize. Reason: ” + e.Message); throw; } finally { fs.Close(); } return universe; } 也许在反序列化之前读取所有内存或使用其他一些序列化技术?

序列化对象消失(BinaryFormatter)

背景 我有一个对象需要序列化才能转移到高性能计算集群供以后使用 以前,我已经为我的对象使用了开箱即用的二进制格式化程序,它代表了一个统计形状模型,并且都很愉快地工作 我的对象变得更加复杂,我决定通过实现ISerializable来自定义序列化过程。 我继续支持以先前格式存储的数据 问题 我的问题是,一个特定值似乎成功序列化,但在尝试反序列化时始终具有null值。 (没有错误,只是一个非常不愉快,无用的空值) 当我在序列化时断开时,我可以通过检查SerializationInfo并且它有值(它没什么特别的,但是会在下面发布它的代码)看到该对象被添加到SerializationInfo中。 正在调用序列化构造函数(我也在那里设置了一个断点),但是当我检查构造函数的SerializationInfo对象时,它没有数据(它有一个条目,只有没有数据) 更新 – 在这里下载控制台应用程序。 谢谢你的期待 或者,看看这里的代码: 代码 导致问题的类:( PointProfiles属性是违规对象) [Serializable] public class TrainingSet : ITrainingSet, ISerializable { public Dictionary<Tuple, IPointTrainingSet> PointProfiles { get; set; } public PrincipalComponentAnalysis PointPCA { get; set; } public double[] AlignedMean { get; set; } public List<Tuple> Transforms { get; set; } […]

BinaryFormatter是否应用任何压缩?

当.NET的BinaryFormatter用于序列化对象图时,是否应用了任何类型的压缩? 我在上下文中询问是否应该担心具有许多重复字符串和整数的对象图。 编辑 – 等一下,如果在.NET中实例化字符串,则无需担心重复的字符串,对吧?

BinaryFormatter中的引用完整性

Protobuf-net中AsReference选项的存在以及BinaryFormatter是一个“图形序列化器”这个词让我认为BinaryFormatter不维护引用并且它会复制每个对象。 但我做了一些测试,发现即使对于递归引用,单个BinaryFormatter Serialize()或Deserialize()调用中的所有引用都会被维护。 我可以确认BinaryFormatter确实维护了引用吗? 这与Protobuf-net有何不同? 好像我理解“图形序列化”不正确? 我还应该注意什么? 提前致谢。

如何识别导致二进制序列化在.NET中失败的字段?

我试图使用以下方法在.NET中序列化对象图: public static byte[] Serialize(object data) { var binary = new BinaryFormatter(); using (var ms = new MemoryStream()) { binary.Serialize(ms, data); return ms.ToArray(); } } 但是,我遇到以下错误: FormatException: Input string was not in a correct format. Stack Trace: at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) […]

在一个程序集中序列化,在另一个程序集中反序列化?

我在两个项目中有相同的类,一个在runtime被发送到另一个进程,该进程必须反序列化该对象并使用它(假设两个对象相同但程序集名称不同,因此它们实际上被解释为两个不同种类)。 根据我的研究,我得出的解决方案由于以下原因而无效。 Json.NET :给我一个例外,即两种类型不兼容(尝试在序列化设置中使用typename.all)。 protobuf-net :要求我在每个地方添加属性或者只是为它提供属性名称(在v2中),由于我的对象太复杂,这对我来说都是不可能的。 BinaryFormatter :与protobuf->吨属性相同的原因。 Use Common Assembly :由于某些与我的项目架构相关的原因,我不能。 那么是否有任何简单的方法来序列化一种类型,然后将其反序列化为另一种类型(实际上是同一个类但在不同的程序集中)?

如何让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.”} 其中pmlscan是原始应用程序的名称。 如何让BinaryFormatter不尝试加载pmlscan?

带有List 的SerializationBinder

我正在尝试使BinaryFormatter在我的程序集的不同版本中工作。 我希望反序列化的实际类在每个程序集版本中完全相同,但在反序列化时,因为序列化对象包括它们来自的程序集名称,所以BinaryFormatter抱怨它无法找到正确的程序集。 所以我创建了一个自定义的SerializationBinder ,它告诉BinaryFormatter总是反序列化到当前的程序集版本。 我的方案工作正常,可以反序列化对象,但如果我的对象是T的列表,它不起作用,其中T是从我的程序集的旧版本序列化的类型。 是否有一些方法可以使用Lists和其他generics类型,其中type参数是我的程序集中的类? //the object i want to deserialize class MyObject { public string Name{get;set;} } //my binder class class MyBinder : SerializationBinder { static string assemblyToUse = typeof (MyObject).Assembly.FullName; public override Type BindToType(string assemblyName, string typeName) { var isMyAssembly = assemblyName.StartsWith(“oldAssemblyName”); var assemblyNameToUse = isMyAssembly ? assemblyToUse : assemblyName; var tn […]

C#对象二进制序列化

我想对对象进行二进制序列化,并将结果保存到数据库中。 Person person = new Person(); person.Name = “something”; MemoryStream memorystream = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(memorystream, person); 如何将字符串类型中的memorystream转换为要保存在数据库中,之后能够反序列化对象?