私は次のxmlを持っています:
<ArrayOfString>
<stringValues>
<stringvalue>teste1</stringvalue>
<stringList>
<stringText>stringList1</stringText>
</stringList>
</stringValues>
</ArrayOfString>
私の契約は次のとおりです。
[KnownType(typeof(StringList))]
[DataContract(Name = "stringValues", Namespace = "")]
public class StringValues
{
[DataMember(Name="stringvalue",Order=1)]
public string stringvalue { get; set; }
[DataMember(Name="stringList",Order=2)]
public StringList stringList { get; set; }
}
[CollectionDataContract(ItemName = "stringText")]
public class StringList : List<string>
{
}
そして、逆シリアル化に使用されるコードは次のとおりです。
var testexml = @"<ArrayOfString>
<stringValues>
<stringvalue>teste1</stringvalue>
<stringList>
<stringText>stringList1</stringText>
</stringList>
</stringValues>
</ArrayOfString>";
XmlDictionaryReader stringsReader = XmlDictionaryReader.CreateDictionaryReader(XmlReader.Create(new StringReader(testexml)));
DataContractSerializer ArrayOfString = new DataContractSerializer(typeof(List<StringValues>), "ArrayOfString", "");
var strings = ArrayOfString.ReadObject(stringsReader);
実行すると、stringListプロパティには1つのアイテムが含まれているはずですが、代わりにゼロのアイテムが含まれています。私は信じています、私の契約に何か問題があります。誰か助けてもらえますか?
前もって感謝します!
このような逆シリアル化の問題をデバッグする最良の方法は、クラスのメモリ内の例を作成し、それを文字列にシリアル化して、取得したものと逆シリアル化したいものを比較することです。違いがある場合、それはあなたのバグです。
クラスのサンプルシリアル化XMLを作成する方法を示すコードは次のとおりです。
private static MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.Unicode.GetBytes(value ?? ""));
}
private static string GetXml<T>(T obj, DataContractSerializer serializer) where T : class
{
using (var textWriter = new StringWriter())
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = " "; // The indentation used in the test string.
using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
{
serializer.WriteObject(xmlWriter, obj);
}
return textWriter.ToString();
}
}
public static string GetXml<T>(T obj) where T : class
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
return GetXml(obj, serializer);
}
注-質問に対する完全な回答ではありませんが、コードが役立つ可能性があり、コメントするには長すぎます。
更新
OK、私はそれを自分で試しました。上位クラスのDataContractの名前空間を、ネストされたクラスの名前空間と同じに設定し、XMLファイル自体に指定されているものと同じにする必要があります。
[CollectionDataContract(ItemName = "stringText", Namespace="")]
public class StringList : List<string>
{
}
そうでない場合DataContractSerializer
は、それらが異なる名前空間にあると想定し、次のようなものを期待します。
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfstringValues xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<stringValues>
<stringvalue>teste1</stringvalue>
<stringList xmlns:d3p1="http://schemas.datacontract.org/2004/07/Clr.Namespace">
<d3p1:stringText>stringList1</d3p1:stringText>
</stringList>
</stringValues>
</ArrayOfstringValues>
Clr.Namespace
クラスを定義したCLR名前空間はどこにありますか。(はい、DataContractSerializer
c#名前空間に基づいてデフォルトの名前空間を割り当てているようですが、それ以外の指示はありません。)
ContractNamespace
これを繰り返し行う必要がない場合は、モジュール全体またはアセンブリ全体で属性を使用することもできます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加