Tag: serialization

克隆整个对象图

使用此代码序列化对象时: public object Clone() { var serializer = new DataContractSerializer(GetType()); using (var ms = new System.IO.MemoryStream()) { serializer.WriteObject(ms, this); ms.Position = 0; return serializer.ReadObject(ms); } } 我注意到它没有复制关系。 有没有办法让这种情况发生?

将EF模型序列化为Json时的循环引用

我知道有很多关于这个主题的问题,但是没有一个问题解决了我的问题。 我正在使用MVC 5和Entity Framework 6以及Newtonsoft.Json。 我有这种例外的通常情况: Service => Staff => Service 当我尝试在我的视图中序列化service对象时,如下所示: var arr = @Html.Raw(@JsonConvert.SerializeObject(Model.Services)); 我得到“ circular reference was detected while serializing an object of type… ”exception。 我在这里找到的所有答案都说它很难解决,我应该补充一下 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .PreserveReferencesHandling = PreserveReferencesHandling.All; GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 在我的Global.asax文件中。 好吧,我做了,它只是不起作用。 我在MSDN上阅读了一堆文章,他们都说了同样的话。 我不知道为什么,但它对我不起作用。 我能使其工作的唯一方法是在我的控制器中创建整个序列化上下文: var settings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All, ReferenceLoopHandling = ReferenceLoopHandling.Serialize }; […]

XmlSerializer:保留未知元素

我有一个从XML序列化/反序列化并存储在文件中/从文件中恢复的类: public class Customer { public string FirstName; public string LastName; public Customer() { } public Customer(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } public static Customer Load(TextReader reader) { XmlSerializer deserializer = new XmlSerializer(typeof(Customer)); return (Customer)deserializer.Deserialize(reader); } public void Save(TextWriter writer) { XmlSerializer serializer = new XmlSerializer(GetType()); serializer.Serialize(writer, this); } […]

protobuf-net:检测到可能的递归

我尝试序列化对象图(不是很深)时遇到exception。 有意义的部分是这样的: [错误]致命的未处理exception:ProtoBuf.ProtoException:可能的递归检测(偏移量:5级):ProtoBuf.ProtoWriter.CheckRecursionStackAndPush(object)处的ProtoBuf.ProtoWriter.StartSubItem(对象,ProtoBuf.ProtoWriter) ,bool) 该图表示文件/目录结构,我的模型(简化)如下所示: [ProtoContract] [ProtoInclude(100, typeof(PackageDirectory))] [ProtoInclude(200, typeof(PackageFile))] public abstract class PackageMember { [ProtoMember(1)] public virtual string Name { get; protected set; } [ProtoMember(2, AsReference=true)] public PackageDirectory ParentDirectory { get; protected set; } } [ProtoContract] public class PackageDirectory : PackageMember { [ProtoMember(3)] private Dictionary _children; public PackageDirectory() { _children = new Dictionary(); } […]

为什么当我用JSON.NET反序列化时忽略我的默认值?

我正在使用JSON.NET作为我的主序列化器。 这是我的模型,看看我已经设置了一些JSONProperties和一个DefaultValue 。 public class AssignmentContentItem { [JsonProperty(“Id”)] public string Id { get; set; } [JsonProperty(“Qty”)] [DefaultValue(1)] public int Quantity { get; set; } } 当我序列化List ,它做得很好: private static JsonSerializerSettings s = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }; OUTPUT: [{“Id”:”Q0″},{“Id”:”Q4″},{“Id”:”Q7″}] 但是当我想反序列化这个jsonContent时,属性Qty始终为0并且未设置为默认值。 我的意思是,当我反序列化jsonContent时,因为Quantity的DefaultValue应该是1而不是0。 public static List DeserializeAssignmentContent(string jsonContent) { return JsonConvert.DeserializeObject<List>(jsonContent, s); […]

使用Json.NET序列化XNA矩形

我正在使用Json.NET首先看看这个: using System.Drawing; string json = JsonConvert.SerializeObject(new Rectangle(-3,6,32,32), Formatting.Indented); Console.WriteLine(json); Rectangle deserializedRectangle = JsonConvert.DeserializeObject(json); 一切都按预期工作。 控制台输出为:“3,6,32,32” 但是当我想用XNA Rectangle做同样的事情时,我得到一个错误。 (只是用“使用Microsoft.Xna.Framework;”替换了旧的使用方法;) 控制台输出为:“{X:-3 Y:6宽度:32高度:32}” 它抛出的错误是:“转换值”{X:-3 Y:6宽度:32高度:32}时出错“输入’Microsoft.Xna.Framework.Rectangle’。” 为什么会这样? 什么是错的,我该如何解决这个问题?

如何将程序集对象序列化/反序列化为字节数组

假设通过编译代码字符串在内存中创建(可执行)程序集。 然后我想将此程序集对象序列化为字节数组,然后将其存储在数据库中。 然后,我想从数据库中检索字节数组,并将字节数组反序列化为一个程序集对象,然后调用程序集的入口点。 起初我只是尝试像.net中的任何其他简单对象那样执行此序列化,但显然这不适用于程序集对象。 程序集对象包含一个名为GetObjectData的方法,该方法获取重新实例化程序集所需的序列化数据。 所以我有点困惑的是我如何将这一切拼凑起来用于我的场景。 答案只需要展示如何获取程序集对象,将其转换为字节数组,将其转换回程序集,然后在反序列化程序集上执行entry方法。

如何在LoadFrom上下文中绑定到程序集时重现InvalidCastException

在Suzanne Cook的.NET CLR笔记中,她谈到了“LoadFrom”环境的危险性。 特别, 如果Load上下文程序集尝试按显示名称加载此程序集,则默认情况下将无法找到它(例如,当mscorlib.dll反序列化此程序集时) 更糟糕的是,可以在探测路径上找到具有相同标识但位于不同路径的程序集,从而导致InvalidCastException,MissingMethodException或稍后出现意外的方法行为。 如何使用反序列化重现此行为,但是没有显式加载两个不同版本的程序集?

c#JSON序列化使用值而不是属性名称

我正在开发一个JSON驱动的项目,我想为SessionManager对象提供一个动态的权限列表。 虽然我可以使用一组键值对进行权限,但我想知道是否可以删除属性名称,以便键是Permission值, 值是IsAllowed值。 public class SessionPermission { public string Permission { get; set; } public bool IsAllowed { get; set; } } public class SessionManager { public string UserName { get; set; } public string Password { get; set; } public List Permissions { get; set; } public void SetPermissions() { Permissions = new List […]

带有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 […]