我已更新到最新版本的 Xamarin Studio,并且我使用的与 Visual Studio 共享的类不再在这两个平台之间工作。我遇到了一些涉及 XML 序列化的编译/运行时错误。我有一个在 Xamarin Studio 中编译的包含以下类的库:
[XmlRoot("dictionary")]
[Serializable]
public class SerializableDictionary<TKey, TValue>
: Dictionary<TKey, TValue>, IXmlSerializable
{
#region IXmlSerializable Members
public SerializableDictionary()
{
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
bool wasEmpty = reader.IsEmptyElement;
reader.Read();
if (wasEmpty)
return;
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
reader.ReadStartElement("item");
reader.ReadStartElement("key");
TKey key = (TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("value");
TValue value = (TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();
this.Add(key, value);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
foreach (TKey key in this.Keys)
{
writer.WriteStartElement("item");
writer.WriteStartElement("key");
keySerializer.Serialize(writer, key);
writer.WriteEndElement();
writer.WriteStartElement("value");
TValue value = this[key];
valueSerializer.Serialize(writer, value);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
#endregion
}
我已经编译了这个 DLL 并在 Visual Studio 的 Windows 项目中引用它,如下所示:
SerializableDictionary<string, string> asdf = new SerializableDictionary<string, string>();
这会产生编译错误:“类型'System.Xml.Serialization.IXmlSerializable'在未引用的程序集中定义。您必须添加对程序集'System.Xml,Version = 2.0.5.0,Culture =中性的引用, PublicKeyToken=7cec85d7bea7798e'"
当然,我确实有对 System.Xml 的引用。事实上,如果我从 Xamarin 复制该类并将其粘贴到 Visual Studio 端的项目中,则该类可以正常工作。根据我构建事物的方式,此错误有一些变体,但这似乎是根本原因。
任何人都知道为什么这个库不再跨平台工作?最新版本的 Xamarin 中的 IXmlSerializable 是否发生了一些变化?