我正在研究WPF应用程序。在此应用程序中,我们具有“同步”功能。也就是说,用户可以将LOCAL状态同步到服务器,或者从SERVER同步LOCAL状态。
状态文件的当前结构如下
[Serializable]
public class State
{
[XmlAttribute("Priority")]
public int Priority { get; set; }
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlElement("Auto")]
[XmlElementAttribute("AMPMConstriants", typeof(AMPMConstriants))]
[XmlElementAttribute("CxDays", typeof(CxDays))]
public object Object { get; set; }
}
“XmlAttribute”的目的是,我们使用xmlSerialization将状态对象本地保存为文件。
为了同步目的,我们使用NewtonSOft.Json将状态对象转换为“json”字符串。 您可以看到我们正在使用数据类型“Object”,这是因为我们需要将不同类型的对象保存到同一个对象中。那就是“对象”值可能是“AMPMConstraints”类型,也可能是CxDays类型。
但问题是当我们序列化状态对象没有为“对象”数据类型正确序列化时。 所以当我们反序列化json字符串时,我们自然没有得到“Object”的值。
我们已经研究过这个问题并找到了一个像添加“JsonSerializerSettings”的解决方案。您可以在下图中看到它。
private static string JsonObjectToStringSerializer<T>(T t)
{
string result = string.Empty;
var jsonSerializerSettings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto,
};
result = JsonConvert.SerializeObject(t, jsonSerializerSettings);
return result;
}
此解决方案工作正常,现在我们能够将状态对象序列化为json字符串并将json字符串反序列化为状态对象。 但我们仍然面临着与名称空间相关的问题。
以上是序列化时生成的json字符串。您可以看到它显示完整的命名空间。 如何从此json字符串中删除全名空间。
请注意我使用的是TypeNameHandling = TypeNameHandling.Auto,
以下是AMPMConstraints和CXDays的类结构
[Serializable]
public class AMPMConstriants
{
[XmlAttribute("AM")]
public bool AM { get; set; }
[XmlAttribute("PM")]
public bool PM { get; set; }
}
[Serializable]
public class CxDays
{
[XmlAttribute("IsSun")]
public bool IsSun { get; set; }
[XmlAttribute("IsMon")]
public bool IsMon { get; set; }
[XmlAttribute("IsTue")]
public bool IsTue { get; set; }
[XmlAttribute("IsWed")]
public bool IsWed { get; set; }
[XmlAttribute("IsThu")]
public bool IsThu { get; set; }
[XmlAttribute("IsFri")]
public bool IsFri { get; set; }
[XmlAttribute("IsSat")]
public bool IsSat { get; set; }
}
我们坚持这个问题。如果您对此问题有任何疑问,请告诉我们。这对我们很有帮助。
由于