- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
其实我有这样一个类
[DataContract]
public class Item : IExtensibleDataObject
{
[Browsable(false)]
public virtual ExtensionDataObject ExtensionData { get; set; }
[DataMember]
public string ID { get; set; }
[DataMember]
public string Name { get; set; }
public Item()
: this(String.Empty, String.Empty)
{ }
public Item(string id, string name)
{
ID = id ?? String.Empty;
Name = name ?? String.Empty;
}
}
您可以轻松地对其进行序列化和反序列化。但现在是困难的部分:
我必须将属性 Name
重命名为 FullName
并且每个新的 xml 序列化文件都应该带有 FullName
而它仍然是可能的读入旧文件。
将新属性名称放入新文件非常容易。只需重命名属性即可。
为了兼容性,我会用 [DataMember(Name="Name")]
标记新属性名称,但在这种情况下,如果我将此类写回到文件中,我会写入旧名称。
DataContract
中存在一些东西,我可以在其中标记我的属性 FullName
可能是两次
[DataMember(Name="Name")]
[DataMember]
public string FullName { get; set}
或者是否有任何其他机制可以证明这两个值都可以写入其中,但只有一个会在回写时出现?
我能想到的唯一方法是创建一个类 LegacyItem
,它没有任何函数或类似的东西,但实现了旧的 DataContract
。此外,还有一些隐式/显式运算符可将我的 LegacyItem
转换为 Item
。最后但并非最不重要的反序列化我必须做一些测试(也许只是一个简单的 try/catch
)来找出我应该告诉 DataContractSerializer
读入文件的类.
因此,即使这种方法可行,对于这项任务来说听起来有点过于复杂,我想知道框架中是否已经有可用的东西可以使这项任务更容易一些。
最佳答案
如果你不介意在你的类中有一些过时的代码(无论如何它会比你建议的整个第二类代码少)那么你可以这样做:
[DataContract]
public class Item : IExtensibleDataObject
{
public virtual ExtensionDataObject ExtensionData { get; set; }
[DataMember]
public string ID { get; set; }
[DataMember(Name = "Name", EmitDefaultValue = false)]
private string _obsoleteName { get { return null; } set { if(value != null) FullName = value; } }
[DataMember]
public string FullName {get; set;}
public Item()
: this(String.Empty, String.Empty)
{ }
public Item(string id, string name)
{
ID = id ?? String.Empty;
FullName = name ?? String.Empty;
}
}
可以读入旧的 XML,反序列化将正确分配给您的新属性。然后在序列化时,只有新属性将通过 set 访问器序列化为 FullName。序列化时,旧属性始终返回 null,并且不会向序列化的 XML 发出事件。
您还可以将过时的属性标记为私有(private),这样它在类之外是不可见的。
一些提示,我更喜欢不对 DataMember
属性使用自动属性。事实上,我通常将支持字段标记为 DataMember
。最好始终为 DataMember
属性包含可选的 Name
参数。我承认我自己并不总是这样做,但这是一个很好的做法,因为如果您在 Visual Studio 中重构 -> 重命名属性或字段,您就不会意外地违反契约(Contract)。
更新
OP Oliver 自己提出了另一种解决方案......对于那些感兴趣的人来说,这是看起来像的东西。
[DataContract]
public class Item : IExtensibleDataObject
{
public virtual ExtensionDataObject ExtensionData { get; set; }
[DataMember]
public string ID { get; set; }
[DataMember(Name = "Name", EmitDefaultValue = false)]
private string _obsoleteName;
[DataMember]
public string FullName {get; set;}
public Item()
: this(String.Empty, String.Empty)
{ }
public Item(string id, string name)
{
ID = id ?? String.Empty;
FullName = name ?? String.Empty;
}
[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
if(_obsoleteName != null && FullName == null)
{
//upgrade old serialized object to new version
//by copying serialized Name field to newer FullName
FullName = _obsoleteName;
//set _obsoleteName to null so that it stops serializing
_obsoleteName = null;
}
}
}
关于c# - 重命名标有 DataMemberAttribute 的类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3447565/
richfaces如何避免显示丰富 TreeMap 标?我想过滤树,如果一个父亲被填充,他将不会显示,但他的 child 会显示,所以我需要从默认图标更改为无图标。 其中项目代表树节点 最佳答案 组
我的 iPad 屏幕上随机出现多个标签。重要的是它们都完全可见。因此,我使用下面的最后 4 行 Position 标签代码 来尝试确保标签的位置完全在屏幕框架内。然而,即使我在这一行中将 100 替换
我想在我的表格原型(prototype)单元格中声明 4 个标签,以便我可以将 Parse 中的所有数据检索到标签中。正如你在图片中看到的,有 4 个标签,我希望每个标签都有自己的 socket ,但
标 checkout 现又消失?
这个问题在这里已经有了答案: How to prevent buttons from submitting forms (20 个答案) 关闭 4 年前。 我有一个非常简单的程序,它使用 JS 将结
我刚刚编写了一个程序,其中有一个包含 JLabel 组件数组的 JFrame。该数组获取由 for 循环分配的单个标签的位置: for(int i=0; i
我不确定这个问题是否已在本网站的其他地方得到解答,但我很难用语言解释我的问题。这里是:我想做的是按用户选择的标签对crawler_results 中的文章进行排序。因此,文章中出现的标签越多(coun
尽管数据点不重复,但图表上的标 checkout 现了两次。 知道如何解决吗? 这是标签 json: labels: { rotation: -45, formatter: funct
我正在尝试使用 css 在屏幕上呈现 SVG。这是我的文件结构。 Root > Assets > Icon > user-icon.svg。所以,我正在尝试使用 CSS 来添加它: .user-ele
我正在向客户端应用程序发送一条消息 MarketDataSnapshotFullRefresh,但我在 toAdmin 方法中收到“标 checkout 现不止一次”。我得到的原始消息字符串是 8=F
在AndroidManifest.xml中,application标签有: android:label="@string/app_name" 并且 res/values/strings.xml 中的
有人尝试使用react-native-icons吗?我遵循以下步骤: npm install react-native-icons @ latest-保存 在XCode中,在项目导航器中,右键单击Li
在此页面中:enter link description here 没有任何在此表下的 HTML 中: Attribute Value Description ... 但是当我在 Google
我使用 Vaadin 7。我尝试使用以下代码更改组件的图标: Tree tree = new Tree("The Planets and Major Moons"); tree.setIcon(new
我已阅读以下内容 article .我正在尝试使用 BHO 扩展嵌入图标。但是,res://协议(protocol)在 HTTPS 站点中不起作用。在 HTTPS 站点中显示本地镜像是否有解决方法或替
我正在使用以下 HTML 代码: hr { border: none; border-top: 3px double #333; color: #333; overflow: visi
我无法弄清楚 背后的复杂逻辑元素实际上被放置。我想要一个有两行的表格。我想要每一行的标签,然后是一个输入框。我想要响应行为,当视口(viewport)变窄时,标 checkout 现在输入的正上方。
我有一个严重的问题 :( 我正在制作一个个人资料页面,我的 DIV 总是可点击的(这不应该发生),当我在 chrome 上检查它的元素时,它显示了所有 DIVS 上的一堆......我做到了不在这里写
我有一个以前没有遇到过的问题,我希望能得到一些相关信息。我有一个导航栏显示在网页的顶部,由于某种原因,当代码运行时,浏览器添加了一些 a>/a> 标签,这导致我的链接有一些...处置本身。我希望找出如
我正在使用 Fix 4.3 并遇到两个问题,如果我能解决一个问题,那么应该会消除第二个问题。 但是...我正在使用 QuickFIX 示例文件作为开始我的项目的方式,我能够连接到目标机器并获取市场数据
标 checkout 现在图片的底部吗?
我对这个 html/css 完全陌生,我正在尝试将带有背景的文本作为图像 float 。是的,我这样做了,但问题是文本 float 在图像的顶部。如果使用 margin-top 进行调整图片,它只是简
我是一名优秀的程序员,十分优秀!