Tag: 序列化

Protobuf.NET使用

需要在托管c#和非托管c ++之间发送一些数据。 经过一番研究后,我尝试使用Protobuf.NET。 我不确定我是否理解ProtoBuf的function…… 在Proto中构建一个类型定义。 我在c ++和c#项目中都需要这种类型定义 使用命令行工具“protogen.exe”从类型定义中获取.cs文件和.cpp,.h 将.cs文件复制到我的c#项目和我的c ++解决方案中的.cpp,.h。 似乎我愚蠢地解决这个问题。 这是我的问题和疑问。 是否可以在c#中定义类型以生成c ++中的文件? 试图使用命令行工具protogen.exe与以下文件 test1.proto using ProtoBuf; namespace ProtocolBuffers { [ProtoContract] class Person { [ProtoMember(1)] public int Id {get;set;} [ProtoMember(2)] public string Name { get; set; } } } test2.proto message Person { required int32 id = 1; required string name = 2; optional […]

使用强类型XSD反序列化XML文档时出错

在尝试使用XmlSerializer.Deserialize()方法反序列化特定的XML文档时,我遇到了一个非常烦人的问题。 基本上,我有一个强类型XSD,其元素类型为double。 当尝试反序列化特定XML文档的元素时,我得到通常的“System.FormatException:输入字符串格式不正确”。 exception,因为在该特定文档中,元素没有值。 这里有一些代码供你书呆子。 示例XML文档: Barcelona 4591 XSD: TrackInfo类: [Serializable] public class TrackInfo { private string name = string.Empty; private double length = 0.0; private double averageSpeed = 0.0; [XmlElement] public string Name { … } [XmlElement] public double Length { … } [XmlElement] public double AverageSpeed { … } } 样本反序列化代码: XmlDocument xmlDocument […]

序列化List包含XML接口

我一直在读书,但我没有找到解决问题的办法 我目前正在使用一个业务对象来保存我的所有数据,我们需要将此对象转换为XML或从XML转换。 我的对象包含一系列动作(列表…),但有两种动作类型(目前为止)。 我必须操作类型SimpleAction和CompositeAction,它们都从IActioninheritance,允许它们都保存在Actions列表中。 现在您可能会看到问题,因为接口无法序列化,因为它们没有数据。 如何,通过一些示例代码,我是否可以编写获取该对象类型的Class或Serializer,然后使用正确的类型序列化对象? 一些代码: [XmlArray(“Actions”)] public List Actions { get; set; } public interface IAction { int ID { get; set; } ParameterCollection Parameters { get; set; } List Validation { get; set; } TestResultEntity Result { get; set; } string Exception { get; set; } } [XmlType(“A”)] public class SimpleActionEntity : […]

Json字符串反序列化为对象的数组列表

请帮忙! 在反序列化时出现此错误: 无法将“System.String”类型的对象转换为“System.Collections.Generic.List”类型 来自客户端的JSON字符串: “\”[{\\“id \\”:\\“18_0_2_0 \\”,\\“ans \\”:\\“您可以输入自由文本代替* \\”},{\\“ id \\“:\\”23_1_3_1 \\“,\\”ans \\“:\\”刷新按钮\\“},{\\”id \\“:\\”11_2_1_2 \\“,\ \ “ANS \\”:\\ “假\\”}] \ “” 编辑:未转义(见评论): [{“id”:“18_0_2_0”,“ans”:“您可以输入自由文字代替* ”},{“id”:“11_2_1_2”,“ans”:“False”}] JavaScriptSerializer serializer = new JavaScriptSerializer(); List ListAnswers = serializer.Deserialize<List>(str); [Serializable] public class RawAnswer { public string QuestionID { get; set; } public string Answer { get; set; } public RawAnswer() { […]

使用EF和WebApi将父/子对象序列化

我在entity framework中有以下模型: public class Customer { [XmlIgnore] public virtual ICollection Children { get; set; } public string Name { get; set; } } 现在我尝试使用web api序列化它: public class CustomerController:ApiController { public HttpResponseMessage GetAll() { using (var tc = new DataContext()) { List allCustomers = tc.Customers.ToList(); return Request.CreateResponse(HttpStatusCode.OK, allCustomers); } } } 当我这样做并使用POST调用该方法时,我收到以下错误: ‘ObjectContent`1’类型无法序列化内容类型’application / json的响应主体; 字符集= […]

优化多维通用数组的二进制序列化

我有一个我需要二进制序列化的类。 该类包含一个字段,如下所示: private T[,] m_data; 这些多维数组可以相当大(数十万个元素)和任何原始类型。 当我在一个对象上尝试标准的.net序列化时,写入磁盘的文件很大,我认为.net存储了很多关于元素类型的重复数据,可能没有那么高效。 我一直在寻找自定义序列化器,但没有看到任何处理多维通用数组。 我已经在内存流的字节数组上尝试了内置的.net压缩,序列化后取得了一些成功,但没有像我希望的那样快速/压缩。 我的问题是,我应该尝试编写一个自定义序列化程序,以便为适当的类型优化序列化此数组(这看起来有点令人生畏),还是应该使用标准的.net序列化并添加压缩? 关于最佳方法的任何建议都将是最受欢迎的,或链接到显示如何处理多维通用数组的序列化的资源 – 如我所发现的现有示例所提到的不支持这样的结构。

将DateTime序列化为二进制

如何正确序列化DateTime对象(例如使用BinaryWriter),并保持其完整状态? 我的印象是日期时间仅由内部长整数表示,并且该整数可以作为DateTime的Ticks属性访问。 但是,查看实现,Ticks属性实际上返回真实内部数据的子集,该子集存储在名为dateData的ulong中 Ticks(刚刚获得InternalTicks)实现如下: public long InternalTicks { get { return (long) this.dateData & 4611686018427387903L; } } 据我所知,这意味着dateData可能包含Ticks属性未显示的信息。 更奇怪的是,DateTime的BinaryFormatter序列化在GetObjectData()中执行此操作: info.AddValue(“ticks”, this.InternalTicks); info.AddValue(“dateData”, this.dateData); 这将在流中输出两个长点,其中一个很容易从另一个中恢复! 如何序列化我的DateTime而不会丢失任何内部状态的风险(当然最好只有8个字节,没有reflection)。 我想也许它可以被铸造(不安全),直接到ulong? 或者我无缘无故担心, Ticks属性是否会实际编码所有必要的状态?

WCF:通用接口的序列化是否可行?

我正在尝试实现一个服务契约,其中包含一个采用通用接口的方法,并且该generics接口本身具有一个接口参数。 我用ServiceKnownType修饰了服务接口,我用常规的KnownType修改了服务实现,并且我用常规的KnownType修饰了datacontract实现: [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ICallbacks))] [ServiceKnownType(typeof(Batch))] [ServiceKnownType(typeof(Command))] public interface IActions { [OperationContract] IResponse TakeAction(IBatch commands); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)] [KnownType(typeof(Batch))] [KnownType(typeof(Command))] internal class Actions : IActions { } [DataContract] [KnownType(typeof(Command))] public class Batch : IBatch { } 为了记录,我在那里有批处理,因为看起来你只能表达一个generics类型的知识类型 – 它似乎发出BatchOfanyType,但我不知道如何处理它。 我得到的例外是“将任何静态未知的类型添加到已知类型列表中 – 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。” 有什么明显的我做错了吗? 是否不支持接口的通用接口? 为了记录我在这个项目的C#2.0和.NET 3.0上。

如何在序列化后加密并保存二进制流并将其读回?

当我想在二进制序列化后加密二进制流并将其保存到文件时,我在使用CryptoStream时遇到一些问题。 我收到以下exception System.ArgumentException : Stream was not readable. 任何人都可以告诉我如何加密二进制流并将其保存到文件并正确反序列化? 代码如下: class Program { public static void Main(string[] args) { var b = new B {Name = “BB”}; WriteFile(@”C:\test.bin”, b, true); var bb = ReadFile(@”C:\test.bin”, true); Console.WriteLine(b.Name == bb.Name); Console.ReadLine(); } public static T ReadFile(string file, bool decrypt) { T bObj = default(T); var _binaryFormatter = […]

C#WPF将richtextbox中粘贴的BitmapImage转换为二进制文件

我有一个richtextbox,我计划保存到数据库,可以将其加载回同一个richtextbox。 我已经将它工作,以便我可以将flowdocument保存为DataFormats.XamlPackage,它可以保存图像,但问题是文本无法搜索。 使用DataFormats.Xaml,我当然有文本,但没有图像。 图像将由最终用户粘贴,而不是应用程序附带的图像。 我尝试使用XamlWriter将文本转换为XML,然后分别从文档中获取图像并将它们作为二进制文件插入到XML中,但我似乎无法找到将图像转换为二进制文件的方法… 有没有人有关于如何将图像分成二进制,与文本分开的想法? 提前致谢! GetImageByteArray()就是问题所在。 码: private void SaveXML() { TextRange documentTextRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd); FlowDocument flowDocument = richTextBox.Document; using (StringWriter stringwriter = new StringWriter()) { using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(stringwriter)) { XamlWriter.Save(flowDocument, writer ); } testRTF t = new testRTF(); t.RtfText = new byte[0]; t.RtfXML = GetImagesXML(flowDocument); t.RtfFullText = stringwriter.ToString(); […]