Tag: 序列化

C#中的序列化和对象版本控制

如果我想序列化一个对象,我必须使用[Serializable]属性,所有成员变量都将写入该文件。 什么我不知道如何进行版本控制,例如,如果我添加一个新的成员变量(重命名一个变量或只是删除一个变量),然后我打开(反序列化)该文件如何确定对象/文件版本,以便我可以正确设置新成员还是进行某种迁移? 如何确定变量是否在加载期间初始化(由反序列化器忽略)。 我知道有版本容忍方法,我可以用[OptionalField(VersionAdded = 1)]属性标记变量。 如果我打开一个旧文件,框架将忽略这个可选(新变量),它将只是零/ null。 但是,我又如何确定变量是通过加载初始化还是被忽略。 我可以将类/对象版本号写入流中。 使用ISerializable方法并在constructor(SerializationInfo oInfo, StreamingContext context)方法中读取此版本号。 这将告诉我流中的类版本是什么。 但是我预计C#中的流式传输框架已经实现了这种版本控制。 我试图从SerializationInfo获取Assembly版本,但它始终设置为当前版本而不是保存对象时使用的版本。 什么是首选方法? 我在网上发现了很多文章,但我找不到一个解决版本问题的好方法…… 任何帮助表示感谢,谢谢,深渊

是否可以序列化C#代码块?

我正在使用C#和.NET 3.5。 是否可以序列化代码块,将其传输到某处,对其进行反序列化,然后执行它? 一个示例用法是: Action pauxPublish = delegate(object o) { if (!(o is string)) { return; } Console.WriteLine(o.ToString()); }; Transmitter.Send(pauxPublish); 有些远程程序在做: var action = Transmitter.Recieve(); action(“hello world”); 我的最终目标是能够在不同的进程中执行任意代码(它没有代码的先验知识)。

将json反序列化为具有默认私有构造函数的类的C#对象

我需要将json反序列化为以下类。 public class Test { public string Property { get; set; } private Test() { //NOTHING TO INITIALIZE } public Test(string prop) { Property = prop; } } 我可以创建一个Test实例 var instance = new Test(“Instance”); 考虑我的json之类的东西 “{ “Property”:”Instance” }” 我如何创建Test类的对象,因为我的默认构造函数是私有的,我得到的对象是Property为NULL 我正在使用Newtonsoft Json解析器。

如何使用DataContractJsonSerializer将类类型而不是命名空间序列化为Json字符串

我正在尝试在WCF服务中使用DataContractJsonSerializer将类层次结构序列化为Json字符串。 序列化派生类的默认行为是将以下键值对添加到对象: “__type”:”ClassName:#Namespace” 我的问题是命名空间很长并且它们使Json字符串膨胀。 我想以某种方式干预序列化并输出它: “__type”:”ClassName” 并且在反序列化时再次介入指向正确的命名空间(我在运行时知道)。 有没有办法做这样的事情?

.NET XML序列化和inheritance

我有这样的结构: public interface A { public void method(); } public class B : A { } public class C : A { } List list; List包含B和C类型的对象,它们还有一些我想保留的字段,我现在可以序列化它,反序列化并获取正确的对象实例吗? 最好是XML 编辑: 是否有任何简单的方法来序列化包含接口的列表,然后将其反序列化回B和C实例?

如何从使用属性修饰的C#类生成.proto文件?

试图让我的思绪围绕谷歌protobuf。 我在C#中发现了一些protobuf的实现,但它们似乎缺少一个function:能够从使用属性修饰的现有C#类自动生成.proto文件。 我想这样做而不是从.proto文件中自动生成的C#类的原因是因为我已经在我的项目中定义了C#类,我不想复制它们只是为了满足ProtoBuf。 有没有人遇到过这种情况? 更新 这可能只是装饰一个C#类而不是使用.proto文件来使用protobuf吗?

将对象序列化为文件时的C#最佳实践

我正在构建一个小应用程序,需要将对象保存到文件中以保存用户数据。 关于我对此文件的序列化,我有两个问题: 我正在创建的对象有一些公共属性和一个事件。 我将[Serializable]属性添加到我的对象,然后意识到我不能序列化一个带有事件的对象。 然后我发现我可以在我的事件[field:NonSerialized]之上添加一个属性,它会起作用。 这是最好的方法吗,或者我应该尝试构建我的Serializable对象而没有任何事件? 我正在序列化的对象保存了一些关于应用程序的用户设置。 这些设置不够灵敏,无法在文件中加密它们,但我仍然不希望它们在不打开我的应用程序的情况下手动篡改。 当我使用普通的BinaryFormatter对象将我的对象序列化为文件时,通过Serialize()方法,我在文件中看到.net对象类型的可读名称,我将其保存到。 有没有办法让某人对此进行逆向工程,看看在不使用我的程序的情况下保存了什么? 有没有办法让某人建立一个小应用程序,并找出如何DeSerialize此文件中的信息? 如果是这样,我将如何隐藏此文件中的信息? 在这种情况下,当将对象序列化为文件时,是否还有其他提示/建议/最佳实践? 提前致谢!

以C-BinaryReader.ReadString的7位格式编码整数

C#的BinaryReader有一个函数,根据MSDN,读取一个编码为“七位整数”的整数,然后读取一个长度为整数的字符串。 是否有一个清晰的七位整数格式文档(我粗略地了解MSB或LSB标记是否有更多字节要读取,其余位是数据,但我会很高兴更精确的东西)。 更好的是,是否有以这种格式读写数字的C实现?

WCF服务参考 – 获取“XmlException:名称不能以'<'字符开头,hex值0x3C”在客户端

我有一个智能客户端应用程序通过WCF与其服务器通信。 数据在客户端上创建,然后通过服务发送以保持持久性。 服务器和客户端通过共享dll使用相同的域类,我在Visual Studio中使用方便的“添加服务引用”function包装SvcUtil.exe并生成客户端和代理类。 尝试调用服务时出现以下错误: System.Xml.XmlException occurred Message=Name cannot begin with the ‘<' character, hexadecimal value 0x3C. Source=System.Xml LineNumber=0 LinePosition=1 StackTrace: at System.Xml.XmlConvert.VerifyNCName(String name, ExceptionType exceptionType) InnerException: 这特别麻烦,因为该服务一次可以工作数周而不会发生此错误,然后突然且没有警告它将再次出现。 我根本无法找出导致它的原因。 当它确实发生时,我会深入研究如何解决它,并且通常不会提出任何比实际尝试以编程方式将事物序列化为xml而遇到相同错误的人。 我只使用生成的客户端和代理来尝试发送此数据。 我已经查看了我的解决方案的Service References\AwesomeService文件夹中生成的代理,看不到任何看似exception的内容。 生成的文件中唯一出现的尖括号是: * .svcinfo,Reference.svcmap,AwesomeService.disco,AwesomeService.wsdl和* .xsd文件中的xml标记 Reference.cs文件中generics集合的参数 我用来调用服务的代码是这样的: using (var client = new AwesomeServiceClient()) { client.SaveAwesomeness(instanceOfAwesomeness); } 这是使用上面列出的调用代码上方的第一帧开始的堆栈: System.Xml.dll!System.Xml.XmlConvert.VerifyNCName(string name, System.Xml.ExceptionType exceptionType) + 0xb5 […]

改进大型结构列表的二进制序列化性能

我有一个结构,在3个整数中持有3d坐标。 在测试中,我将一个包含100万个随机点的List 组合在一起,然后将二进制序列化用于内存流。 内存流大约是21 MB – 这看起来非常低效,因为1000000点* 3个coords * 4个字节应该在最小11MB时出现 它在我的测试台上也需要约3秒钟。 有关提高性能和/或尺寸的想法吗? (如果有帮助,我不必保留ISerialzable接口,我可以直接写入内存流) 编辑 – 从下面的答案我已经把一个序列化摊牌比较BinaryFormatter,’原始’BinaryWriter和Protobuf using System; using System.Text; using System.Collections.Generic; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.IO; using ProtoBuf; namespace asp_heatmap.test { [Serializable()] // For .NET BinaryFormatter [ProtoContract] // For Protobuf public class Coordinates : ISerializable { [Serializable()] [ProtoContract] public […]