- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将 C# (.NET Framework 4.5.2) 中的一个类与 XML 序列化(反序列化),该类具有 string
的字典属性。键和 string[]
数组值。我正在使用 SerializableDictionary<TKey, TValue>
this answer 中提到的实现在另一个问题上,这意味着我的属性(property)类型为 SerializableDictionary<string, string[]>
.
将其序列化为 XML 文件看起来工作正常;但是,反序列化总是因 System.InvalidOperationException 而失败。
即使只是反序列化字典本身也会发生这种情况。请参阅下面重现问题的 MSTest 单元测试:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using My.Namespace.Collections; // Where SerializableDictionary is defined.
using System.Xml.Serialization;
using System.IO;
using System.Linq;
namespace My.Namespace.Collections.Tests
{
/// <summary>
/// Provides unit test methods for the <see cref="SerializableDictionary{TKey, TValue}"/> class.
/// </summary>
[TestClass]
public class SerializableDictionaryTests
{
/// <summary>
/// A basic test that the <see cref="SerializableDictionary{TKey, TValue}"/> class has working
/// (de)serialization.
/// </summary>
[TestMethod]
[Timeout(100)]
public void SerializableDictionary_BasicTest()
{
// Arrange.
var sourceDictionary = new SerializableDictionary<string, string[]>();
SerializableDictionary<string, string[]> destinationDictionary;
var serializer = new XmlSerializer(typeof(SerializableDictionary<string, string[]>));
var list1 = new string[] { "apple", "banana", "pear" };
var list2 = new string[] { "carrot", "broccoli", "cauliflower", "onion" };
var list3 = new string[] { "beef", "chicken" };
sourceDictionary.Add("fruits", list1);
sourceDictionary.Add("vegetables", list2);
sourceDictionary.Add("meats", list3);
// Act.
using (var stream = new MemoryStream())
{
serializer.Serialize(stream, sourceDictionary);
stream.Position = 0;
destinationDictionary = (SerializableDictionary<string, string[]>)serializer.Deserialize(stream);
}
// Assert.
// NOTE: We don't get this far because it crashes on the last statement above in the using block.
Assert.AreEqual(3, destinationDictionary.Keys.Count);
Assert.IsTrue(destinationDictionary.ContainsKey("fruits"));
Assert.IsTrue(destinationDictionary.ContainsKey("vegetables"));
Assert.IsTrue(destinationDictionary.ContainsKey("meats"));
Assert.AreEqual(3, destinationDictionary["fruits"].Length);
Assert.IsTrue(destinationDictionary["fruits"].Contains("apple"));
Assert.IsTrue(destinationDictionary["fruits"].Contains("banana"));
Assert.IsTrue(destinationDictionary["fruits"].Contains("pear"));
Assert.AreEqual(4, destinationDictionary["vegetables"].Length);
Assert.IsTrue(destinationDictionary["vegetables"].Contains("carrot"));
Assert.IsTrue(destinationDictionary["vegetables"].Contains("broccoli"));
Assert.IsTrue(destinationDictionary["vegetables"].Contains("cauliflower"));
Assert.IsTrue(destinationDictionary["vegetables"].Contains("onion"));
Assert.AreEqual(2, destinationDictionary["meats"].Length);
Assert.IsTrue(destinationDictionary["meats"].Contains("beef"));
Assert.IsTrue(destinationDictionary["meats"].Contains("chicken"));
}
}
}
异常是在 serializer.Deserialize
打电话,读:
Test method My.Namespace.Collections.Tests.SerializableDictionaryTests.SerializableDictionary_BasicTest threw exception:
System.InvalidOperationException: There is an error in XML document (8, 8). ---> System.InvalidOperationException: There is an error in XML document (8, 8). ---> System.InvalidOperationException: <ArrayOfString xmlns=''> was not expected.
为什么会出现此异常,我该如何避免?如果可能的话,我想避免只为这一个属性求助于自定义 XML 序列化。
编辑#1:
我制作了一个运行上述构建和序列化代码的小型控制台程序,然后使用 FileStream
将生成的 XML 写入文件。类(class)。这是它的内容:
<?xml version="1.0"?>
<dictionary>
<item>
<key>
<string>fruits</string>
</key>
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>apple</string>
<string>banana</string>
<string>pear</string>
</ArrayOfString>
</value>
</item>
<item>
<key>
<string>vegetables</string>
</key>
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>carrot</string>
<string>broccoli</string>
<string>cauliflower</string>
<string>onion</string>
</ArrayOfString>
</value>
</item>
<item>
<key>
<string>meats</string>
</key>
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>beef</string>
<string>chicken</string>
</ArrayOfString>
</value>
</item>
</dictionary>
编辑#2:
经过一些额外的测试更改 TValue
SerializableDictionary<TKey, TValue>
的类型在我的测试中声明不同的东西并检查它是否有效,如果TValue
,我可以确认它工作正常是string
, 但如果将它设置为我的自定义可序列化类,即使该类装饰有 SerializableAttribute
,也会出现相同的错误。或实现 IXmlSerializable
界面。所以,问题实际上比字符串数组更大。
最佳答案
在为此苦苦挣扎了几天之后,我得出的结论是 Serializable<TKey, TValue>
我使用的实现无法修改以处理数组和其他对象。
我求助于实现 IXmlSerializable
我类的界面,字典值序列化为 WriteXml
中的列表方法。在 ReadXml
,我简单地反序列化存储的列表,并将其值放回字典中,同时检查是否没有重复键存储为列表项的附加属性。它很笨重,但很管用。
关于c# - 如何(反)序列化具有字符串数组值的可序列化字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49368839/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!