草庐IT

可变序列

全部标签

c# - 如何使结构不可变?

在StackOverflow和互联网上,我发现保持结构不可变是一个很好的设计原则。不幸的是,我从未见过任何实际导致这些结构真正不可变的实现。假设一个结构内部没有任何引用类型,我该如何真正使结构不可变?也就是说,我如何防止其任何原始字段发生突变(可能通过编译时/运行时异常)?我写了一个简单的测试,试图使结构不可变,但即使使用System.ComponentModel.ImmutableObjectAttribute也不起作用:classProgram{staticvoidMain(string[]args){ImmutableStructimmStruct1=newImmutableSt

c# - Json.NET 如何覆盖通过属性定义自定义 JsonConverter 的类型的序列化?

我正在尝试使用Json.NET和自定义JsonConverter对象反序列化一个类。该类当前使用JsonConverterAttribute为默认序列化定义转换器。我需要通过传入自定义转换器来进行自定义反序列化。但是,反序列化似乎仍在使用默认转换器。如何让Json.NET更喜欢我的自定义转换器?下面是一些演示该问题的示例代码。我正在使用NewtonSoft.Json4.5.11:voidMain(){JsonConvert.DeserializeObject("{}");//throws"inthedefaultconverter"varsettings=newJsonSerializ

c# - Azure 服务总线序列化类型

随着我们转向面向服务的架构,我们已经开始研究使用WindowsAzure服务总线来替代我们当前的队列。大部分文档都很清楚;但是我很难确定BrokeredMessage在提供正文时使用哪种类型的序列化。例如,假设我实例化了一个BrokeredMessage对象,如下所示:ICommandsendMessageCommand=newSendMessageCommand{Title="Anewmessagetitle",Body="Anewmessagebody"};BrokeredMessagebrokeredMessage=newBrokeredMessage(sendMessageCo

c# - .NET 枚举类型实际上是可变值类型吗?

仔细观察枚举类型的字段,我惊讶地发现保存枚举特定实例实际值的“支持”实例字段不是private,正如我所想的,但是public.它不是readonly任何一个。(IsPublic真,IsInitOnly假。)许多人认为.NET类型系统中的“可变”值类型是“邪恶的”,那么为什么枚举类型(例如从C#代码创建的)就是这样?现在,事实证明,C#编译器有某种魔法可以否认公共(public)实例字段的存在(但见下文),但在例如PowerShell你可以这样做:prompt>$d=[DayOfWeek]::Thursdayprompt>$dThursdayprompt>$d.value__=6pro

c# - Dictionary<Key, Value> 上 .NET 二进制序列化的奇怪行为

我在.NET的二进制序列化中遇到了一个奇怪的行为,至少符合我的预期。在OnDeserialization回调之后,加载的Dictionary的所有项目都被添加到它们的父级。相比之下,List则采用另一种方式。这在现实世界的存储库代码中可能真的很烦人,例如,当您需要向字典项添加一些委托(delegate)时。请检查示例代码并观察断言。这是正常行为吗?[Serializable]publicclassData:IDeserializationCallback{publicListList{get;set;}publicDictionaryDictionary{get;set;}public

c# - Json.NET 在返回 json 序列化字符串时添加反斜杠

我正在尝试使用Json.NET将列表序列化为json字符串,但返回的字符串中有反斜杠,这又导致json解析失败。varx=fromdinentities.Books.ToList()selectnew{ID=d.ID,BookName=d.BookName};returnJsonConvert.SerializeObject(x.ToList());以上代码返回"[{\"ID\":1,\"BookName\":\"MVCMusicStore-Tutorial-v3.0\"},{\"ID\":2,\"BookName\":\"Pro.ASP.NET.MVC.3.Framework\"},

c# - 将 JSON 反序列化为 IDictionary<string,object>

这个问题在这里已经有了答案:HowdoIuseJSON.NETtodeserializeintonested/recursiveDictionaryandList?(5个答案)关闭7年前。我正在尝试将一些旧作品转换为使用NewtonsoftJSON.NET。使用System.Web.Script.Serialization.JavaScriptSerializer.Deserialize的默认处理方法(例如,如果未指定目标类型)是返回一个Dictionary用于内部对象。这实际上是JSON的一个非常有用的基本类型,因为它也恰好是ExpandoObjects使用的基础类型。并且是动态类型

c# - json.net 不序列化派生类的属性

我正在使用JSON.NET6.0.1。当我使用SerializeObject方法序列化派生类的对象时,它仅序列化基类的属性。这是代码片段:stringv=JsonConvert.SerializeObject(service,Formatting.Indented,newJsonSerializerSettings(){TypeNameHandling=TypeNameHandling.All});基类:[DataContract]publicabstractpartialclassDataEntity:IDataEntity,INotifyPropertyChanging,INoti

c# - 由于字符串是不可变的,具有相同字符串值的变量是否指向同一个字符串对象?

一)strings="value";strings1="value";s和s1引用变量是否指向同一个字符串对象(我假设这是因为字符串是不可变的)?b)我意识到相等运算符(==、>等)已被重新定义以比较字符串对象的值,但在使用静态方法Object.Equals()和Object.ReferenceEquals()比较两个字符串时也是如此?谢谢 最佳答案 不,并非所有具有相同值的字符串都是相同的对象引用。编译器生成的字符串都将是Interned并且是相同的引用。运行时生成的字符串在默认情况下不会被保留,并且会是不同的引用。vars1="

c# - C# 中的排序列表<String>

如何根据项目的整数值对列表进行排序列表是这样的"1""5""3""6""11""9""NUM1""NUM0"结果应该是这样的"1""3""5""6""9""11""NUM0""NUM1"是否有使用LINQ或Lambda表达式执行此操作的想法?提前致谢 最佳答案 这称为“自然排序顺序”,通常用于对您拥有的项目进行排序,例如文件名等。这是一个天真的(从某种意义上说,它可能有很多unicode问题)实现似乎可以解决问题:您可以将下面的代码复制到LINQPad中执行并测试它。基本上,比较算法将识别字符串中的数字,并通过用前导零填充最短的数字