在C#中,如何在序列化期间使XmlSerializer忽略属性,而不是在反序列化期间忽略属性?(或者我如何对Json.net做同样的事情?)
要阻止属性序列化,可以添加XmlIgnore
属性:
[XmlIgnore]
public int FooBar {get;set;}
Run Code Online (Sandbox Code Playgroud)
这将导致<FooBar>
在序列化期间省略标记.
但是,这也意味着<FooBar>
在反序列化期间将忽略标记.
在我的例子中,我在请求中接受来自用户的一系列项目,并且对于每个项目,如果用户想要添加,修改或删除项目,则可以指定动作属性.我想为GET列表调用使用相同的模型对象,并且不想返回此action属性.我希望这是一个很常见的情况.
另一个用例:说你有一个圆形对象
public class Circle
{
public double Radius { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并修改它以添加直径属性
public class Circle2
{
public double Diameter { get; set; }
public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }
}
Run Code Online (Sandbox Code Playgroud)
您可能只想序列化直径,但仍能够以旧格式反序列化仅包含半径的xml文件.
我做了我的研究并没有找到任何东西,因此这个问题
解决方案:我找到了解决方案.我可以在此MSDN文档中添加一个始终返回false的ShouldSerialize属性
(如果重新打开此问题,可以将此解决方案添加为实际答案)
我有一个小的Vaadin应用程序,它有几个输入字段(组合框,选择组等...).其中大部分内容由第一个ComboBox的所选内容决定.但是,当我选择其中的内容时,所有其他内容都保持空白,直到我点击一个,此时它们都会更新.这不是期望的行为,但我认为它是由服务器端是最新的但不更新客户端视图引起的.(即使在我的第一个Combobox的ValueChangeListener中添加requestRepaint())
必须有一些方法强制Vaadin获取我希望它显示的数据,即使没有点击其他组件?
编辑我不允许这么快就回答我自己的问题,所以我暂时把它放在这里:
我发现有一个javascript方法可以同步客户端和服务器.
myComponent.getApplication().getMainWindow().executeJavaScript("javascript:vaadin.forceSync();");
Run Code Online (Sandbox Code Playgroud)
我现在唯一的问题是,当我点击另一个组合框(或两次相同的组合框)时,我的一个组合框上的ValueChangeListener仍然只会触发.这是最奇怪的事情,因为第二个组合框在装载时会完美地发射它的事件.
List.of(E... elements)
java中的方法返回的列表确实返回了一个不可变的列表,但是通过查看所创建的列表根本看不到该列表。创建的列表只是抛出一个异常,而不是根本没有显示更改列表的可能性。我的意思是,那List.of(E... elements)
应该返回一个ImmutableList
that extends List
。这样,用户可以决定他是否愿意显示这种不变性的事实。但是我没有发现有人抱怨或显示其他解决方案。默认情况下,甚至Guava和Apache Commons也不会这样做。只有Guava才有可能创建它(尽管有很多代码):
List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three"));
ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
Run Code Online (Sandbox Code Playgroud)
但是,即使此类也具有(不建议使用)add
和remove
方法。
谁能告诉我为什么没人关心这个(看似基本的)问题?