Tag: serialization

使用Json.Net序列化对象会导致Out of Memoryexception

免责声明:我确实完成了这里提供的大部分解决方案,但大部分都是在反序列化时讨论OOMexception。 我正在尝试使用Json.Net将对象(它是一个树)序列化为Json。 一切都适用于小对象但我在尝试使用大对象时会出现OOMexception。 由于它适用于相同数据类型的较小对象,我假设没有循环引用(我确实检查了我的数据结构)。 有没有办法我可以将我的对象转换为流(这是一个Windowsapp store应用程序)并使用该流生成Json? public static async Task SerializeIntoJson(string fileName, StorageFolder destinationFolder, Content content) { ITraceWriter traceWriter = new MemoryTraceWriter(); try { string jsonString = JsonConvert.SerializeObject(content, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, TypeNameHandling = TypeNameHandling.All, Error = ReportJsonErrors, TraceWriter = traceWriter, StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }); System.Diagnostics.Debug.WriteLine(traceWriter); StorageFile file = await destinationFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); […]

如何序列化静态类的非静态子类

我想序列化一个非常普通的类,但问题是它嵌套在这样的静态类中: public static class StaticClass { [Serializable] public class SomeType { … } } 这段代码: StaticClass.SomeType obj = new StaticClass.SomeType(); XmlSerializer mySerializer = new XmlSerializer(typeof(obj)); 产生此错误: StaticClass.SomeType cannot be serialized. Static types cannot be used as parameters or return types. 这个错误似乎完全无关紧要; StaticClass.SomeType不是静态类型。 有没有解决的办法? 我错误地认为这个错误是愚蠢的吗?

k__BackingField在C#中删除(通过Swashbuckle / Swagger看到)

我在ASP.NET webapi项目中使用Swashbuckle 5并使用所有默认设置。 它序列化我的方法的输出,以显示回复的模式。 我得到的文档看起来像这样: Response Class (Status 200) Model Model Schema [ { “k__BackingField”: “string”, “k__BackingField”: “string”, “k__BackingField”: 0 } ] 这是通过遵循C#代码生成的 /// /// Fetches all system configuration items /// /// List of items public IList GetAllSystemConfigurationItems() { var result = CommandProcessor.ProcessCommand(new SystemConfigurationQueryCommand()) as SystemConfigurationQueryCommandResponse; return result.Results.ToList(); } 其中result.Results基本上是一个标准的对象列表,每个对象包含这些键/值/ id字段。 我在这里阅读https://conficient.wordpress.com/2014/05/22/getting-rid-of-k__backingfield-in-serialization/,[serializable ]属性可能会影响这个,但我不愿意摆脱它属性,如果可能的话。 是否有任何配方来调整此序列化工件?

C#和.NET:如何使用BinaryWriter将结构序列化为byte 数组?

如何使用BinaryWriter将相当复杂的结构序列化为byte []数组? 更新: 为此,必须使用[Serializable]属性修饰每个结构(和子结构?)。 我不需要实现ISerializable接口,因为它旨在通过自己的序列化来控制对象。

使用JSON.NET将属性反序列化为ExpandoObject

例如,有一个像下一个的对象: public class Container { public object Data { get; set; } } 它以这种方式使用: Container container = new Container { Data = new Dictionary { { “Text”, “Hello world” } } }; 如果我反序列化从序列化上面的实例获得的JSON字符串, Data属性,即使我提供ExpandoObjectConverter ,它也不会反序列化为ExpandoObject : Container container = JsonConvert.Deserialize(jsonText, new ExpandoObjectConverter()); 如何反序列化使用匿名对象分配的类属性,或者至少不是具体类型作为ExpandoObject ? 编辑: 有人回答说我可以使用动态对象。 这对我不起作用。 我知道我可以这样做,但事实并非如此,因为我需要一个ExpandoObject。 谢谢。 编辑2: 其他一些用户回答我可以将JSON字符串反序列化为ExpandoObject 。 这不是这个问题的目标。 我需要反序列化具有动态属性的具体类型。 在JSON字符串中,此属性可以是关联数组。

WCF:序列化为数组的通用列表

所以我正在使用WCF和我的服务返回包含通用列表的类型。 WCF目前正通过线路将这些转换为arrays。 有没有办法配置WCF以后再将它们转换回列表? 我知道在添加服务引用时单击高级有一种方法,但我正在寻找配置文件或类似的解决方案。 [DataContract(IsReference = true)] public class SampleObject { [DataMember] public long ID { get; private set; } [DataMember] public ICollection Objects { get; set; } } 这也很奇怪,因为一个服务将其作为列表返回,另一个服务作为数组返回,我很确定它们的配置相同。

结构的快速序列化/反序列化

我有大量的地理数据表示在简单的对象结构中,只包含结构。 我的所有字段都是有价值的类型。 public struct Child { readonly float X; readonly float Y; readonly int myField; } public struct Parent { readonly int id; readonly int field1; readonly int field2; readonly Child[] children; } 数据很好地分配给Parent[] -s的一小部分。 每个数组包含几千个父实例。 我有太多的数据来保存所有内存,所以我需要来回交换这些块到磁盘。 (一个文件大约2-300KB)。 对于dumpint到磁盘并回读,将Parent[]序列化/反序列化为byte[]的最有效方法是什么? 关于速度, 我对快速反序列化特别感兴趣 ,写入速度并不是那么关键。 简单的BinarySerializer会不够好? 或者我应该使用StructLayout (参见接受的答案) ? 我不确定这是否适用于Parent.children数组字段。 更新:对注释的响应 – 是的,对象是不可变的(代码更新),并且children字段实际上不是值类型。 300KB听起来并不多,但我有数以万计的文件,所以速度确实很重要。

如何从 INotifyPropertyChanged实现者中排除不可序列化的观察者?

我有近百个实体类看起来像这样: [Serializable] public class SampleEntity : INotifyPropertyChanged { private string name; public string Name { get { return this.name; } set { this.name = value; FirePropertyChanged(“Name”); } } [field:NonSerialized] public event PropertyChangedEventHandler PropertyChanged; private void FirePropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 注意PropertyChanged上的[field:NonSerialized]属性。 这是必要的,因为一些观察者(在我的情况下 – 显示版本实体的网格)可能不是可序列化的,并且实体必须是可序列化的,因为它是通过远程处理由分离器机器上运行的应用程序提供的。 。 此解决方案适用于琐碎的案例。 但是,某些观察者可能是[Serializable] ,并且需要保留。 […]

如何在Protobuf中发送多种类型的对象?

我正在实现客户端 – 服务器应用程序,并正在研究序列化和传输数据的各种方法。 我开始使用Xml Serializers,它运行得相当好,但是生成数据很慢,并且生成大对象,特别是当它们需要通过网络发送时。 所以我开始研究Protobuf和protobuf-net。 我的问题在于protobuf没有发送类型信息。 使用Xml Serializers,我能够构建一个包装器,它将在同一个流上发送和接收任何各种(可序列化)对象,因为序列化为Xml的对象包含对象的类型名称。 ObjectSocket socket = new ObjectSocket(); socket.AddTypeHandler(typeof(string)); // Tells the socket the types socket.AddTypeHandler(typeof(int)); // of objects we will want socket.AddTypeHandler(typeof(bool)); // to send and receive. socket.AddTypeHandler(typeof(Person)); // When it gets data, it looks for socket.AddTypeHandler(typeof(Address)); // these types in the Xml, then uses // the appropriate […]

如何让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?