Tag: 序列化

在C#中,如何序列化System.Exception? (.Net CF 2.0)

我想写一个MS Message Queue的exception。 当我尝试它时,我得到一个例外。 所以我尝试使用仍然引发exception的XmlSerializer来简化它,但它给了我更多信息: {“反映类型’System.Exception’时出错。”} 与InnerException: {“无法序列化System.Collections.IDictionary类型的成员System.Exception.Data,因为它实现了IDictionary。”} 示例代码: Exception e = new Exception(“Hello, world!”); MemoryStream stream = new MemoryStream(); XmlSerializer x = new XmlSerializer(e.GetType()); // Exception raised on this line x.Serialize(stream, e); stream.Close(); 编辑:我尽量保持这个简单,但我可能已经过度了。 我想要整个位,堆栈跟踪,消息,自定义exception类型和自定义exception属性。 我甚至可能想再次抛出exception。

使用Json.NET将JSON反序列化为对象

我正在使用新的StackOverflow API 。 不幸的是,我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的这个JSON: {“user”:{ “user_id”: 1, “user_type”: “moderator”, “creation_date”: 1217514151, “display_name”: “Jeff Atwood”, … “accept_rate”: 100 }} 到我用JsonProperty属性修饰的对象: [JsonObject(MemberSerialization.OptIn)] public class User { [JsonProperty(“user_id”, Required = Required.Always)] public virtual long UserId { get; set; } [JsonProperty(“display_name”, Required = Required.Always)] public virtual string Name { get; set; } … } 我得到以下exception: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需属性’user_id’。 这是因为JSON对象是一个数组吗? 如果是这样,我如何将其反序列化为一个User对象? […]

无法使用Json.net使用Complex键序列化Dictionary

我有一个自定义.net类型的字典作为其密钥。我正在尝试使用JSON.net将此字典序列化为JSON,但是它无法在序列化期间将密钥转换为适当的值。 class ListBaseClass { public String testA; public String testB; } —– var details = new Dictionary(); details.Add(new ListBaseClass { testA = “Hello”, testB = “World” }, “Normal”); var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary> results); 这个给我 – >“{\”JSonSerialization.ListBaseClass \“:\”Normal \“}” 但是,如果我将自定义类型作为字典中的值,它可以很好地工作 var details = new Dictionary(); details.Add(“Normal”, new ListBaseClass { testA = “Hello”, […]

如何为二进制格式化程序创建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 { […]

如何使用XmlSerializer序列化内部类?

我正在建立一个与第三方接口的库。 通过XML和HTTPpost进行通信。 那很有效。 但是,无论代码使用哪个库都不需要知道内部类。 我使用此方法将内部对象序列化为XML: internal static string SerializeXML(Object obj) { XmlSerializer serializer = new XmlSerializer(obj.GetType(), “some.domain”); //settings XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.OmitXmlDeclaration = true; using (StringWriter stream = new StringWriter()) { using (XmlWriter writer = XmlWriter.Create(stream, settings)) { serializer.Serialize(writer, obj); } return stream.ToString(); } } 但是,当我将类的访问修饰符更改为internal ,我在运行时得到一个exception: [System.InvalidOperationException] = {“MyNamespace.MyClass由于其保护级别而无法访问。只能处理公共类型。”} […]

使用每种类型的不同格式在同一类中序列化多个DateTime属性

我有一个具有两个DateTime属性的类。 我需要使用不同的格式序列化每个属性。 我该怎么做? 我试过了: JsonConvert.SerializeObject(obj, Formatting.None, new IsoDateTimeConverter {DateTimeFormat = “MM.dd.yyyy”}); 此解决方案对我不起作用,因为它将日期格式应用于所有属性。 有没有办法用不同的格式序列化每个DateTime属性? 也许有一些属性?

使用C#中的枚举值反序列化Dictionary

我试图在C#中序列化/反序列化Dictionary 。 对象可以是可序列化的任何东西。 Json.NET几乎可以工作,但如果字典中的值是enum ,则反序列化不正确,因为它被反序列化为long 。 TypeNameHandling.All没有任何区别。 是否还有其他快速的序列化库解决方案。 结果不一定是JSON,但必须是文本。 我对传递给字典的数据也没有影响。 我只需要序列化和反序列化我遇到的任何事情。 编辑: StringEnumConverter没有帮助。 数据被转换回Dictionary ,因此反序列化器不知道序列化值是enum 。 它将它视为一个对象,使用StringEnumConverter在反序列化时它仍然是一个string ; 如果没有转换器,它会被反序列化。 JSON.NET不保留枚举。 我想提供的解决方案是现有接口的实现,它被注入到我无法改变的现有解决方案中。 EDIT2:这是我想要做的一个例子 public enum Foo { A, B, C } public enum Bar { A, B, C } public class Misc { public Foo Foo { get; set; } } var dict = new Dictionary(); […]

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

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

使用CData部分包装属性 – XML序列化C#

我需要以这样的方式序列化我的对象,使我想要的属性绕过CData部分。 我希望我能做到这样的事情: public class Order { [JsonProperty] public int OrderId { get; set; } [JsonProperty] public string Name { get; set; } [JsonProperty] public int Type { get; set; } [JsonProperty] public decimal Amount { get; set; } [JsonProperty] public DateTime Date { get; set; } [DataMember] [JsonProperty] **[WrapCData]** public List ListB { get; set; […]

反序列化时,C#类中的字段初始化程序不运行

我有一个定义受保护字段的类。 受保护的字段具有字段初始值设定项。 当我反序列化具体类时,不会运行字段初始值设定项。 为什么? 解决问题的最佳模式是什么? 如果我将初始化移动到构造函数中,也不会调用构造函数。 [DataContract] public class MyConcrete { // FIELD INITIALIZER DOES NOT RUN WHEN COMMENTED IN: protected readonly Dictionary myDict;// = new Dictionary(); public MyConcrete() { myDict = new Dictionary(); } private bool MyMethod(int key) { return myDict.ContainsKey(key); } private int myProp; [DataMember] public int MyProp { get { return myProp; […]