Tag: serialization

使用JSON.net,在基类上下文中使用时,如何防止派生类的属性序列化?

给定一个数据模型: [DataContract] public class Parent { [DataMember] public IEnumerable Children { get; set; } } [DataContract] public class ChildId { [DataMember] public string Id { get; set; } } [DataContract] public class ChildDetail : ChildId { [DataMember] public string Name { get; set; } } 出于实现方便的原因,有时Parent上的ChildDetail对象实际上是ChildDetail对象。 当我使用JSON.net序列化Parent ,它们将被写出所有ChildDetail属性。 是否有任何方法可以指示JSON.net(或任何其他JSON序列化程序,我还不能提交到项目中),在序列化为基类时忽略派生类属性? 编辑:重要的是,当我直接序列化派生类时,我能够生成所有属性。 我只想抑制Parent对象中的多态性。

在Protobuf-net中,如何在内部传递具有不同类型对象的类型对象数组,事先知道潜在类型的集合

我正在尝试将使用XmlSerializer的现有代码迁移到protobuf-net,因为它提供了更高的性能,但是我遇到了这个特定情况的问题。 我有一个对象[],其中包含将要发送到远程主机的参数(一种自定义的迷你rpc工具)。 我知道这些参数的类型集合,但我无法预先知道它们将以何种顺序发送。 我有三个限制。 首先是我在Compact Framework中运行,所以我需要在那里工作的东西。 其次,正如我所提到的,性能是一个很大的问题(在序列化方面)所以我宁愿避免在可能的情况下使用大量的reflection。 最重要的是我关心这些参数的发送顺序。 使用XmlSerializer很容易只添加XmlInclude,但对于字段,就我所知,在Protobuf-net中没有任何等价物。 那么,有没有办法做到这一点? 这是一个简化的例子。 [Serializable] [XmlInclude(typeof(MyType1)), XmlInclude(typeof(MyType2)), XmlInclude(typeof(MyType3)) public class Message() { public object[] parameters; public Message(object[] parms) { parameters = parms; } } Message m = new Message(new object[] {MyType1(), 33, “test”, new MyType3(), new MyType3()}); MemoryStream ms = new MemoryStream(); XmlSerializer xml = new XmlSerializer(typeof(Message)); xml.Serialize(ms,xml); […]

将对象列表写入文件

我有一个以下格式的class级推销员: class salesman { public string name, address, email; public int sales; } 我有另一个用户输入姓名,地址,电子邮件和销售的课程。 然后将此输入添加到列表中 List salesmanList = new List(); 在用户根据需要向列表中输入尽可能多的推销员之后,他们可以选择将列表保存到他们选择的文件中(我可以将其限制为.xml或.txt(这更适合))。 如何将此列表添加到文件中? 如果用户希望稍后查看记录,则还需要将该文件重新读回列表。

使用protobuf-net反序列化未知类型

我有2个网络应用程序,应该相互发送序列化的protobuf-net消息。 我可以序列化对象并发送它们,但是, 我无法弄清楚如何反序列化接收的字节 。 我尝试使用它反序列化,并且失败并出现NullReferenceException。 // Where “ms” is a memorystream containing the serialized // byte array from the network. Messages.BaseMessage message = ProtoBuf.Serializer.Deserialize(ms); 我在包含消息类型ID的序列化字节之前传递一个标头,我可以在一个巨大的switch语句中使用它来返回预期的sublcass Type。 使用下面的块,我收到错误:System.Reflection.TargetInvocationException —> System.NullReferenceException。 //Where “ms” is a memorystream and “messageType” is a //Uint16. Type t = Messages.Helper.GetMessageType(messageType); System.Reflection.MethodInfo method = typeof(ProtoBuf.Serializer).GetMethod(“Deserialize”).MakeGenericMethod(t); message = method.Invoke(null, new object[] { ms }) […]

如何在同一对象中使用重复的属性名称反序列化JSON

我有一个JSON字符串,我希望包含重复键,我无法让JSON.NET满意。 我想知道是否有人知道最好的方法(也许使用JsonConverter ?)让JArrays在看到重复的键名时将JObject的子JObjects转换为JArrays ? // For example: This gives me a JObject with a single “JProperty\JObject” child. var obj = JsonConvert.DeserializeObject(“{ \”HiThere\”:1}”); // This throws: // System.ArgumentException : Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject. obj = JsonConvert.DeserializeObject(“{ \”HiThere\”:1, \”HiThere\”:2, \”HiThere\”:3 }”); 我试图反序列化的实际JSON要复杂得多,并且重复项嵌套在多个级别。 但上面的代码说明了为什么它失败了。 我知道JSON不正确,这就是为什么我要问JSON.NET是否有办法解决这个问题。 为了论证,让我说我无法控制JSON。 我实际上对父对象使用特定类型,但遇到问题的特定属性将是字符串或另一个嵌套的JSON对象。 由于这个原因,失败的属性类型是“对象”。

尽管将PreserveReferencesHandling设置为“None”,Json.Net仍向EF对象添加$ id

我已经看过如何在JSON序列化期间删除$ id但是给出的答案似乎对我没有用,我希望有人能弄清楚我做错了什么。 这是我的代码: return JsonConvert.SerializeObject(target, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include, PreserveReferencesHandling = PreserveReferencesHandling.None, ContractResolver = new CustomContractResolver(), Converters = CustomConverters }); 这个输出仍然以$ id出现,但仅限于entity framework对象,这是设计的吗? 如果是这样,有没有办法阻止Entity Framework对象上的那些$ id?

将对象序列化为自定义字符串格式以在输出文件中使用的最佳实践

我刚要在特定的业务类上实现ToString()的覆盖,以便生成一个Excel友好的格式来写入输出文件,稍后将对其进行拾取和处理。 这是数据应该是什么样子: 5555555 “LASTN SR, FIRSTN” 5555555555 13956 STREET RD TOWNSVILLE MI 48890 25.88 01-003-06-0934 创建一个格式字符串并覆盖ToString()对我来说没什么大不了的,但这会改变我决定以这种方式序列化的任何对象的ToString()行为,使得ToString()的实现在整个库中都变得粗糙。 现在,我一直在阅读IFormatProvider ,并且实现它的类听起来是个好主意,但我仍然对所有这些逻辑应该驻留的位置以及如何构建formatter类感到困惑。 当你需要从对象中制作CSV,制表符分隔或其他非XML任意字符串时,你们会怎么做?

JSON.NET Parser *似乎*是双重序列化我的对象

我的问题是: 这是从我的WebAPI控制器发回的响应。 “[ [ {\”id\”:\”identifier\”}, {\”name\”:\”foobar\”} ] ]” 请注意,响应包含在引号中,并且所有嵌入的引用都被转义。 这显然是个问题。 我可以为JSON.NET Serializer提供任何设置以防止这种情况发生吗? 编辑 正如pswg在他的回答中猜到的那样,我正在使用JSON.NET JsonConvert.SerializeObject(instance) 执行我的序列化。 我这样做是因为当我构建我的自定义转换器时,我将它们包含在我的WepApiConfig中的JsonConvert.DefaultSettings中(我显然认为这不是问题) 我之前尝试将我的HttpGets的返回类型交换为“我的对象类型”,响应是我对象的ToString()方法的json表示…这让我知道序列化没有通过我的转换器。 将我的HttpGets的返回类型从字符串更改为“我的对象类型”并将这些转换器直接插入到WebAPi的默认HttpConfiguration中就可以了。 config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new FooConverter()); config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new BarConverter()); 十分简单。

Json.net序列化特定的私有字段

我有以下课程: public class TriGrid { private List _hexes; //other private fields… //other public proprerties } 我的目标是仅序列化_hexes字段,因此我创建了以下ContractResolver: internal class TriGridContractResolver : DefaultContractResolver { protected override List GetSerializableMembers(Type objectType) { return new List { objectType.GetMember(“_hexes”, BindingFlags.NonPublic | BindingFlags.Instance)[0] }; } } 当我想序列化TriGrid的一个实例时,我做了: var settings = new JsonSerializerSettings() { ContractResolver = new TriGridContractResolver() }; var json = JsonConvert.SerializeObject(someTriGrid, […]