3

XML シリアライゼーションに関して問題があります。次のxmlファイルの例で説明してみます

<AutoExpo>
  <Details>
    <Venue>XYZ</Venue>
    <StartTime>09:00</StartTime>
    <EndTime>21:00</EndTime>
  </Details>

  <Cars>
      <Car>
        <Company>Chevrolet</Company>
        <Model>Cruz</Model>
        <Color>Red</Color>
      </Car>

      <Car>
        <Company>Ford</Company>
        <Model>Fiesta</Model>
        <Color>Blue</Color>
      </Car>

  </Cars>
</AutoExpo>

ここで、この xml ファイルを読み取るときに、車をオブジェクトに逆シリアル化します。車のリストは膨大になる可能性があります。私のコードはこのオブジェクトを使用しており、一部の車のプロパティを変更できます。ここで、プロパティが変更された車のオブジェクトのみをシリアル化し、xml ファイルに戻して保存し、次にコードを開始したときに最新の状態情報を取得できるようにするにはどうすればよいでしょうか。

4

5 に答える 5

1

プロパティがどこで変更されても、あちこちでプロパティを変更して XML ファイル内を移動するのは非常に困難です。ファイル全体をメモリに読み込むだけで、保存するときにすべてを書き出して、古いファイルを上書きする必要があります。

XML はこれを行うのにひどい方法ではありませんが、質問からわかる限り、SQL Server (または他の RDBMS) データベースの方がはるかに適切です。このような問題は、DB エンジンが自動的に行うため、心配する必要はありません。

于 2012-05-24T13:00:16.637 に答える
0

これは最善の解決策ではないかもしれませんが、実行可能なオプションとして、編集したリストを別のファイルにシリアル化し、コードで 2 つのファイルを比較することが考えられます。情報に変更がない場合、2 つのテキスト ファイルは同一である必要があります。そうでない場合は、古いファイルを新しいファイルに置き換えることができます。最も簡単な方法は、ファイルにシリアル化して読み書きするのではなく、ストリームに送信してそれらを比較することです。

于 2012-05-24T12:54:32.343 に答える
0

オブジェクトをシリアル化すると、XML ドキュメント全体が生成されます。したがって、それをファイルに保存すると、ファイルの以前の内容が上書きされます。したがって、結果のファイルに、変更されたものを含むがこれに限定されないすべての車を含める場合は、すべてをシリアル化する必要があります。変更されたものだけをシリアル化すると、変更されていないすべての車がファイルから失われます。本当に変更した車だけをシリアライズしたい場合は、AutoExpo オブジェクトの新しいインスタンスを作成し、保存したい車だけを挿入してから、そのオブジェクトを部分的なリストだけでシリアライズすることをお勧めします。

データが大きすぎるために XML の 1 つの要素だけを変更する必要があり、残りの要素には手を加えない場合、XML は適切な選択ではありません。代わりにリレーショナル データベースをお勧めします。または、各車を独自の XML ファイルとして保存し、必要に応じてそれぞれを個別にロードおよび保存することもできます。

于 2012-05-24T12:56:59.750 に答える
0

XML でそれを行うことはできません。リレーショナル データベースの使用を検討してください。リレーショナル データベースには組み込みのファイル スペース管理メカニズムがあり、まさに必要なことを行うことができます。単一のレコードを更新し、レコードを追加および削除できます。

Jet .mdb データベース (Access) は、XML ファイルの代わりとして適しています。アプリケーションを 32 ビット用にコンパイルする必要があるという制限付きで、OLEDB 経由でアクセスできます。Access をインストールする必要はありません。

于 2012-05-24T12:58:23.353 に答える
0

まず、エンティティには一意の識別子が必要です。

<AutoExpo>
  <Details>
    <Venue>XYZ</Venue>
    <StartTime>09:00</StartTime>
    <EndTime>21:00</EndTime>
  </Details>

  <Cars>
    <Car id="1">
      <Company>Chevrolet</Company>
      <Model>Cruz</Model>
      <Color>Red</Color>
    </Car>
    <Car id="2">
      <Company>Ford</Company>
      <Model>Fiesta</Model>
      <Color>Blue</Color>
    </Car>
  </Cars>
</AutoExpo>

XPath を使用して、更新が必要なノードを選択し、その内容を変更できるようになりました。

  1. ドキュメントを XDocument にロードする
  2. 車を探す: document.Element("Car[id=2]")
  3. 新しい値を設定します: element.Element("Color").Value = "Black"

ただし、ファイルベースのストレージを使用することの欠点は残ります。ファイル全体をメモリにロードし、更新中にハード ドライブに書き戻す必要がありますが、すべての Car オブジェクトをシリアル化する必要はありません。ファイルをハード ドライブからストリーミングして、一度に操作する簡単な方法が思い浮かびません。

于 2012-05-24T13:22:02.843 に答える