Tag: serialization

使用reflection来确定.Net类型在内存中的布局方式

我正在尝试在C#中优化解析器组合器。 当序列化格式与内存格式匹配时,一种可能的优化是仅对要在实例上解析的数据的(不安全)memcpy甚至该类型的许多实例进行解析。 我想编写确定内存中格式是否与序列化格式匹配的代码,以便动态确定是否可以应用优化。 (显然这是一个不安全的优化,可能无法解决一大堆微妙的原因。我只是在尝试,而不是计划在生产代码中使用它。) 我使用属性[StructLayout(LayoutKind.Sequential,Pack = 1)]强制不填充并强制内存顺序匹配声明顺序。 我用reflection检查该属性,但实际上所有这些都证实是“无填充”。 我还需要字段的顺序。 (我非常希望不必为每个字段手动指定FieldOffset属性,因为这很容易出错。) 我假设我可以使用GetFields返回的字段顺序,但文档明确指出订单未指定。 鉴于我使用StructLayout属性强制字段的顺序,有没有办法反映该排序? 编辑我很好,所有字段必须是blittable的限制 。

在.NET应用程序中使用PCL时,如果被调用的类包含方法,则为TypeLoadException

我正在将现有的.NET类库改编为可移植类库。 我使用配置文件78(.NET 4.5,Windows Store 8,Windows Phone 8)支持配置文件158(也针对Silverlight 5),因为我希望能够编译原始库的unsafe代码。 .NET库包含很多标记为[Serializable]的类,所以我实现了一个包含虚拟SerializableAttribute实现的支持PCL库: public class SerializableAttribute : Attribute { } 它是从主PCL库中引用的。 为了充分利用.NET应用程序中的主PCL库,同时避免类型名称冲突,我还准备了一个.NET支持库(与PCL支持库具有相同的强名称),包含类型转发声明: [assembly: TypeForwardedTo(SerializableAttribute)] 并在我的.NET应用程序中显式引用.NET支持库而不是PCL库。 在准备好所有这些并且能够成功编译PCL适配库之后,我重新使用原始.NET库中的unit testing,现在引用PCL主库和.NET支持库。 这通常非常有效,但对于包含[Serializable]类和[OnDeserialized]修饰方法的unit testing: [Serializable] public class Foo { [OnDeserialized] private void DoSomething(StreamingContext context) { } } 我得到以下TypeLoadException : 在程序集“MyPclAssembly”中键入“Foo”的方法为“DoSomething”,其序列化属性的签名不正确。 (可以注意到OnDeserializedAttribute包含在可移植子集中,可能是因为它也在[DataContract]序列化中被识别。) 在原始.NET库上运行unit testing时,我没有获得exception。 我仔细分析了Foo类中的方法签名,它完全符合这些(de-)序列化辅助方法应该具有的签名,参见例如此处 。 我也尝试将[OnDeserialized]方法的可见性更改为internal和public ,但无济于事。 使用PCL库时出现此exception的原因是什么,我该怎么做才能避免它? 编辑我已经检查了PCL库的IL代码和[OnDeserialized]方法的.NET库,我看不出任何相关的区别: PCL .method private hidebysig instance […]

XmlSerializer.Deserialize List 项目

我已经尝试了所有可以在SO和其他地方找到的解决方案,但似乎无法弄清楚为什么这不起作用。 将XML字符串直接反序列化为对象,该对象具有一个属性 – 一个List: [XmlTypeAttribute(AnonymousType = true)] public class UpdateData { [XmlArrayItem(ElementName = “Updates”)] public List Updates { get; set; } public UpdateData() { Updates = new List(); } } public class Update { [XmlElement(ElementName = “MemberID”)] public int MemberID { get; set; } [XmlElement(ElementName = “AnalysisID”)] public int AnalysisID { get; set; } [XmlElement(ElementName […]

序列化和反序列化为XML文件,C#

我有以下代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication28 { class Program { static void Main() { List dirs = FileHelper.GetFilesRecursive(@”c:\Documents and Settings\bob.smith\Desktop\Test”); foreach (string p in dirs) { Console.WriteLine(p); } //Write Count Console.WriteLine(“Count: {0}”, dirs.Count); Console.Read(); } static class FileHelper { public static List GetFilesRecursive(string b) { // 1. // […]

C#Compact Framework – 使用XmlSerializer.Serialize的OutOfMemoryException

我正在尝试序列化集合中的大量对象(20,000)对象。 我正在使用以下代码执行此操作: XmlSerializer xs = new XmlSerializer(deserialized.GetType()); StringWriter sw; using (sw = new StringWriter()) { xs.Serialize(sw, deserialized); // OutOfMemoryException here } string packet = sw.ToString(); return packet; 有没有更好的方法来做到这一点,还是我做了一些公然错误的事情?

反序列化通用列表返回null

我正在/像这样对一个对象进行序列化: public class myClass : ISerializable { public List value; public myClass(SerializationInfo info, StreamingContext context) { this.value = (List)info.GetValue(“value”, typeof(List)); } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue(“value”, value, typeof(List)); } } 列表中的对象具有Seri​​alizable属性。 序列化时,不会抛出任何错误,列表永远不会为空,但是当反序列化我的所有列表都为空时,我不知道为什么。 我将此标记为CQ的回答。 我能够生成一个小的测试应用程序,它正确地使用我正在尝试使用的对象进行序列化/反序列化但我仍然无法让它在我的生产代码中工作,但我怀疑它是小的我我失踪了。

您能用Google的协议缓冲区格式表示CSV数据吗?

我最近发现了协议缓冲区,并想知道它们是否可以应用于我的具体问题。 基本上我有一些CSV数据,我需要转换为更紧凑的格式存储,因为一些文件是几个演出。 CSV中的每个字段都有一个标题,只有两种类型,字符串和小数(因为有时会有很多有效数字,我需要以相同的方式处理所有数字)。 但是每个文件的每个字段都有不同的列名。 除了捕获原始CSV数据外,我还需要在保存之前向文件中添加额外信息。 我希望通过处理不同的文件版本来certificate这一点。 那么,是否可以使用协议缓冲区来捕获随机数量的随机命名数据列,如CSV文件?

树结构的序列化/ Derialization

我试图找出保存(序列化)和以后打开(反序列化)树结构的最佳方法。 我的结构由具有不同属性的各种对象类型组成,但每个都inheritance自基本抽象“Node”类。 每个节点都有唯一的ID(GUID),并且有一个AddSuperNode(Node nd)方法,用于设置节点的父节点。 这反过来调用其他方法,允许父节点知道它有哪些子节点。 但是,某些节点还使用AddAuxSuperNode()方法向节点添加辅助父节点。 我正在使用二进制序列化,但现在我想我想使用一些我有更多控制的东西,并且序列化数据更容易访问。 我还希望在反序列化时保留Type信息,并能够序列化私有值。 所以DataContractSerializer似乎是最好的方式。 我不能直接序列化根节点,因为节点有多个父节点。 我不想创建重复的对象。 所以我似乎需要将树解构为一个平面列表,然后将其序列化。 然后在序列化该列表后重建树。 这听起来不错吗? 就像我在每个节点都有一个唯一的GUID标识符之前所说的那样,但是现在节点直接引用它们的父节点/子节点并且不存储它们的id。 我可以更新AddSuperNode()和AddAuxSuperNode()方法,以便除了直接引用之外还更新要序列化的父ID列表。 但是我宁愿只在序列化对象时更新/创建这个列表。 所以我想在节点中创建一个UpdateSuperNodeIDRefs()方法,该方法将在序列化之前调用。 以下是我计划对此结构进行序列化和反序列化的操作。 任何人都可以建议更好/更清洁/更有效的方法吗? 序列化 1)提供树结构的根节点 2)将树结构分解为平面词典(Guid id,Node nd) ,其中id是nd的guid 。 3)调用UpdateSuperNodeIDRefs() ; 为每个节点更新为其父节点保存的ID。 4)使用DataContractSerializer序列化节点字典 反序列化 1)反序列化节点字典 2)遍历字典中的每个节点 ,将每个节点重新连接到其父节点 。 对于存储的任何父ID,查找具有匹配ID的字典中的相应节点调用AddSuperNode()或AddAuxSuperNode()以将节点重新连接到其父节点。 3)从Dictionary中的任何节点找到结构的根 4)返回根节点

如何识别导致二进制序列化在.NET中失败的字段?

我试图使用以下方法在.NET中序列化对象图: public static byte[] Serialize(object data) { var binary = new BinaryFormatter(); using (var ms = new MemoryStream()) { binary.Serialize(ms, data); return ms.ToArray(); } } 但是,我遇到以下错误: FormatException: Input string was not in a correct format. Stack Trace: at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) […]

为什么我会收到序列化错误?

我有以下代码: class Program { static void Main(string[] args) { string xml = @” Proposals LastGroup Visible WidgetsVisibility “; List settings = GetObjFromXmlDocument<List>(xml); } public static T GetObjFromXmlDocument(string xml) { T customType; XmlSerializer serializer = new XmlSerializer(typeof(T)); XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(xml); using (XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlDocument)) { customType = (T)serializer.Deserialize(xmlNodeReader); } return customType; […]