Tag: serialization

Json.NET根据属性类型使属性成为必需

我正在努力使用.Net核心中的自定义json序列化,我正在尝试默认所需的所有属性,除非属性具有特定类型。 这是我想要实现的一个例子: 让我们确定我有以下类型:F#: type FooType = { id: int name: string optional: int option } 你可以考虑下面的代码与C#中的类似: class FooType = { int Id {get;set;}; string Name {get;set;}; Nullable Optional {get;set;}; } 我想要做的是返回错误,如果json对象中缺少Id或Name属性,但如果缺少Optional,则反序列化而不会出现错误(因此基本上根据需要将属性设置为不需要)。 我可以使用此示例中的RequireObjectPropertiesContractResolver标记所有属性: https : RequireObjectPropertiesContractResolver但不幸的是我无法构建更具动态性的东西。 我还有我希望添加到序列化的可选类型的默认转换器。 它不是这个特定问题的一部分,但是如果您知道如何将属性标记为必需或在一个地方使用自定义转换器,那么它甚至可能更大。

AppFabric缓存 – 对象的序列化和反序列化要求是什么?

问题:当缓存一个类的实例并立即将其从缓存中取回时,我得到了对象(它不是null),但它的所有属性/字段都是null或默认值。 _cacheHelper.PutInCache(“testModuleControlInfoOne”, mci); //mci has populated fields var mciFromCacheOne = _cacheHelper.GetFromCache(“testModuleControlInfoOne”); //mciFromCacheOne now has null or default fields 所以我怀疑对象的结构方式是问题,AppFabric没有因某种原因正确地序列化对象。 但是,当我使用下面的序列化方法时,我得到的对象包含序列化之前的所有属性/字段。 public T SerializeThenDeserialize(T o) where T : class { BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream()) { bf.Serialize(ms, o); ms.Position = 0; return (T)bf.Deserialize(ms); } } 如何使用二进制格式化程序正确地序列化和反序列化,而不是通过缓存完全相同的事情? 有没有人遇到这个或有没有人有任何建议或提示一般要注意什么?

使用Json.Net自定义DateTime序列化

我正在尝试创建自定义DateTime转换器失败。 问题:我有许多要序列化的对象,其中包含DateTime的一些包含DateTime.MinValue的属性。 我想将它序列化为null。 但是我要求在对象内部装饰正确的所有解决方案(我不能这样做)我在下面找到的其他解决方案,就是创建转换器,据我所知,这个转换器只能工作,只能明确返回DateTime对象而不是在其他对象内。 请帮忙。 public class DateTimeConverter : JsonConverter { private readonly Type[] types; public DateTimeConverter(params Type[] types) { this.types = types; } public override bool CanConvert(Type objectType) { return types.Any(t => t == objectType); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JToken t = JToken.FromObject(value); if (t.Type != JTokenType.Object) […]

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

Base64反序列化期间的空引用exception(C#)

我使用以下方法序列化和反序列化.NET对象: public static string SerializeToBase64(object data) { var stream = new MemoryStream(); var formatter = new BinaryFormatter(); formatter.Serialize(stream, data); stream.Position = 0; return Convert.ToBase64String(stream.ToArray()); } public static object DeserializeFromBase64(string data) { var stream = new MemoryStream(Convert.FromBase64String(data)); stream.Position = 0; var formatter = new BinaryFormatter(); return formatter.Deserialize(stream); } 使用标有[Serializable]属性的简单类时,这些方法似乎工作正常。 但是我需要使用这段代码来序列化由ORM框架创建的实体类(也称为Serializable),其中每个实体类都是从我没有源代码的基类派生的。 使用实体类的实例时,它完成序列化而没有exception,但反序列化总是在执行formatter.Deserialize()时抛出空引用exception。 我不太熟悉序列化的过程,但我认为这个问题必定是由目标对象状态中的exception引起的。 在序列化之前,对象必须满足一组标准标准吗? 任何其他调试建议将不胜感激。 蒂姆,谢谢 更新: […]

byte 到ArrayList?

有人可以告诉我如何在Windows Mobile下使用C#将byte []转换为ArrayList? 稍后编辑: 这就像拥有一个包含自定义类型实例的ArrayList。 此列表作为字节数组转发到数据库(转换为blob)(转换由数据库API完成); 我想要的是将byte []还原为ArrayList; .NET CF不提供BinaryFormatter;

没有为Protobuf-net中的类型:System.Management.Automation.PSObject定义的序列化程序

这是我的class级 [ProtoContract] internal class Powershellresults { internal Powershellresults() { } [ProtoMember(1)] public Collection PsObjects { get; set; } [ProtoMember(2)] public string Script { get; set; } [ProtoMember(3)] public string Viewname { get; set; } } 但我得到没有为类型定义序列化程序:System.Management.Automation.PSObject当我尝试序列化它 private byte[] SerializeResults(Powershellresults obj) { byte[] data; using (var ms = new MemoryStream()) { ProtoBuf.Serializer.Serialize(ms, obj); data = ms.ToArray(); […]

自定义NewtonSoft.Json以进行值对象序列化

有时,也许在DDD情况下,您可能希望使用C#创建值对象来表示数据,为您的域提供比使用原始类型更多的含义,并具有不可变的额外好处。 例如: public class PostalCode // Bit like a zipcode { public string Value { get; private set; } public PostalCode(string value) { Value = value; } // Maybe sprinkle some ToString()/Equals() overrides here } 布拉沃。 干得好 唯一的事情是,当序列化为Json时,你得到这个: { “Value”: “W1 AJX” } 那种看起来没问题,但当它被用作对象的属性(让我们说一个地址)时,它看起来像这样: { “Line1”: “Line1”, “Line2”: “Line2”, “Line3”: “Line3”, “Town”: “Town”, “County”: “County”, […]

我如何使用Windows 10通用应用程序中的xsd.exe生成的文件

我使用xsd.exe从.xsd文件生成.cs文件。 但是当我将文件添加到Windows 10通用空白应用程序时,我收到的错误是“缺少System.SerializableAttribute()和System.ComponentModel.DesignerCategoryAttribute(”code“)的程序集引用。 我通过@t.ouvre的技巧解决了这个问题。 然后在代码的任何特定行中没有错误,但是当我构建代码时,我收到一条错误,说“无法在模块System.dll中找到类型System.ComponentModel.MarshalByValueComponent”并且它没有完全指定错误在哪里。 如何在Windows 10通用应用程序中使用xsd.exe生成的文件? 我需要对文件进行序列化和反序列化的所有事情是什么(在UWP中使用DataContractSerializer) /// [System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”, “4.6.81.0”)] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute(“code”)] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] [System.Xml.Serialization.XmlRootAttribute(Namespace = “”, IsNullable = false)] public partial class request { private usertype userField; private string versionField; /// [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public usertype user { get { return this.userField; } set { this.userField = value; } } /// […]

无法使用Json.NET 8.0.1反序列化具有字节数组属性的对象

在升级代码库以使用Json.NET 8.0.1之后,一些反序列化会失败。 使用Json.NET 7.0.1一切正常。 显然,它是类型为byte[]的属性的反序列化导致了问题。 如果我删除byte[]属性,它工作正常。 我可以使用这个简单的控制台应用程序重现行为: internal class Program { private static void Main(string[] args) { Dictionary accounts; var jsonSerializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple }; using (var streamReader = new StreamReader(“accounts.json”)) { var json = streamReader.ReadToEnd(); accounts = JsonConvert.DeserializeObject<Dictionary>(json, jsonSerializerSettings); } foreach (var account in accounts) { Debug.WriteLine(account.Value.Name); […]