3

タイトルが示すように、次のファイルを逆シリアル化すると、最初の (常に最初の) 要素のみが取得されます。

<?xml version="1.0"?>
<ServerConnections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Entries>
    <ServerConnectionEntry>
      <Name>Local</Name>
      <Host>127.0.0.1</Host>
      <Port>15556</Port>
      <Username>TestUser</Username>
      <AuthHash>
        <base64Binary>u7a0NN4uOvCrb5t5UWVVEl14Ygo=</base64Binary>
      </AuthHash>
    </ServerConnectionEntry>
    <ServerConnectionEntry>
      <Name>Local2</Name>
      <Host>127.0.0.1</Host>
      <Port>15556</Port>
      <Username>TestUser</Username>
      <AuthHash>
        <base64Binary>u7a0NN4uOvCrb5t5UWVVEl14Ygo=</base64Binary>
      </AuthHash>
    </ServerConnectionEntry>
  </Entries>
</ServerConnections>

逆シリアル化する私のコード:

var list = (ServerConnections)mSerializer.Deserialize(inputStream)).Entries;

その場合、list.Count は 1 です。ServerConnections は次のようになります。

public class ServerConnections
{
    public ServerConnectionEntry[] Entries { get; set; }
}

例外は発生していません。

編集: カスタム xml シリアル化 (IXmlSerializable を実装) を行うクラスを含めると、問題が発生します。それが行うことは次のとおりです。

void BigNumber::ReadXml(System::Xml::XmlReader^ reader) {
    reader->ReadStartElement();
    XmlSerializer^ serializer = gcnew XmlSerializer(cli::array<Byte>::typeid);
    cli::array<Byte>^ data = (cli::array<Byte>^)serializer->Deserialize(reader);
    pin_ptr<unsigned char> ptr(&data[0]);
    BN_bin2bn(ptr, data->Length, mNumber);
}

void BigNumber::WriteXml(System::Xml::XmlWriter^ writer) {
    XmlSerializer^ serializer = gcnew XmlSerializer(cli::array<Byte>::typeid);
    serializer->Serialize(writer, ToByteArray());
}

データには ReadXml の後に正しいデータが含まれていますが、リスト全体を動作させるデシリアライザーは停止し、追加の要素を読み取りません。

4

3 に答える 3

1

問題はありません。私はあなたのコードのシナリオ(以下に含まれる完全なテスト)を再現しましたが、正しく機能しています。

他の場所を検索してみてください (たとえば、渡されxmlたものが期待どおりのものであることを確認してください)。ただし、シリアル化は C# クラス マッピングで正しく機能しています

byte[]EDIT:AuthHashクラスは、 tobase64とbackの変換を行いません

public class ServerConnections
{
    public ServerConnectionEntry[] Entries { get; set; }
}
public class ServerConnectionEntry
{
    public string Name { get; set; }
    public AuthHash AuthHash { get; set; }
}
public class AuthHash
{
    [XmlIgnore]
    public byte[] Hash { get; set; }
    public string base64Binary
    {
        get { return Convert.ToBase64String(Hash); }
        set { Hash = Convert.FromBase64String(value); }
    }
}
[TestClass]
public class DeserializationTest
{
    public const string MyXml = @"<?xml version=""1.0""?>
<ServerConnections 
   xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" 
   xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
  <Entries>
    <ServerConnectionEntry>
      <Name>Local</Name>
      <Host>127.0.0.1</Host>
      <Port>15556</Port>
      <Username>TestUser</Username>
      <AuthHash>
        <base64Binary>u7a0NN4uOvCrb5t5UWVVEl14Ygo=</base64Binary>
      </AuthHash>
    </ServerConnectionEntry>
    <ServerConnectionEntry>
      <Name>Local2</Name>
      <Host>127.0.0.1</Host>
      <Port>15556</Port>
      <Username>TestUser</Username>
      <AuthHash>
        <base64Binary>u7a0NN4uOvCrb5t5UWVVEl14Ygo=</base64Binary>
      </AuthHash>
    </ServerConnectionEntry>
  </Entries>
</ServerConnections>
";
    [TestMethod]
    public void Deserialization_Has_Two_Elements()
    {
        TextReader reader = new StringReader(MyXml);
        var mySerializer = new XmlSerializer(typeof(ServerConnections));

        var list = ((ServerConnections)mySerializer.Deserialize(reader)).Entries;

        Assert.IsTrue(list.Count() == 2);

        Assert.IsTrue(list.First().Name == "Local");
        Assert.IsTrue(list.Last().Name == "Local2");

        Assert.IsTrue(list.First().AuthHash.Hash.Length > 0);
        Assert.IsTrue(list.Last().AuthHash.Hash.Length > 0);
    }
}
于 2013-06-22T10:50:39.740 に答える
1

ここでも同じです。これは、あなたと同様のコードを使用して私にとってはうまくいくようです。

 public class Program
{
    static void Main(string[] args)
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(ServerConnections));
        var reader = new StreamReader(@"../../Test.xml");
        var entries = (ServerConnections)deserializer.Deserialize(reader);
        reader.Close();
    }

    public class ServerConnections
    {
        public ServerConnectionEntry[] Entries { get; set; }
    }

    public class ServerConnectionEntry
    {
        public string Name { get; set; }
        public string Host { get; set; }
        public string Port { get; set; }
        public string Username { get; set; }
        public BinaryCode AuthHash { get; set; }
    }

    public class BinaryCode
    {
        [XmlElement("base64Binary")]
        public string Code { get; set; }
    }
}
于 2013-06-22T11:01:13.790 に答える