0

さまざまな色を含むXML構成ファイルを展開しようとしていますが、現在は次のようになっています。

<Colors>
    <FooColor1>0x0BD000</FooColor1>
    <FooColor2>0x11C711</FooColor2>
    <FooColor3>0x224466</FooColor3>
    <FooColor4>0xAA3333</FooColor4>
    <FooColor5>0x886644</FooColor5>
</Colors>

これらはすべてストリングとして出てきて、すべてがうまく機能し、ダンディです。問題はここにあります、私が言ったように、私はファイルを拡張しようとしています、新しいフォーマットはこのようになります

<Colors>
    <DetailColors>
        <FooColor1>0x0BD000</FooColor1>
    <FooColor2>0x11C711</FooColor2>
    <FooColor3>0x224466</FooColor3>
    <FooColor4>0xAA3333</FooColor4>
    <FooColor5>0x886644</FooColor5>
    </DetailColors>
    <GoalColors>
        //Similar stuff, not actually in yet.
    </GoalColors>
</Colors>

ただし、単一レベルで機能したシリアル化スタイルでは、ネストを処理できないようです。

[System.SerializableAttribute()]
public class GraphColors
{
  public string FooColor1 { get; set; }
  public string FooColor2 { get; set; }
  public string FooColor3 { get; set; }
  public string FooColor4 { get; set; }
  public string FooColor5 { get; set; }

}
[System.SerializableAttribute()]
public class DetailColors
{
  [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
  public GraphColors ColorSchema { get; set; }
}
[System.SerializableAttribute()]
public class Colors
{
  [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
  private DetailColors CombinedColors { get; set; }
  public static GraphColors getColorsFromConfig()
  {
     return new XmlSerializer(Colors).Deserialize(path).CombinedColors.ColorSchema
  }
}

これは、中間オブジェクトがない場合は正常に機能しましたが、中間オブジェクトがnull値を与えるようになりました。どんな助けでも大歓迎です。

4

3 に答える 3

1

C#コードが間違っているようです。

代わりに試してください:

public class GraphColors { ... }

public class Colors
{
    public GraphColors DetailColors { get; set; }
}

あなたのコードは、xmlがColors要素、次にCombinedColors要素、そしてaDetailColorsも含む要素で構成されていることを期待しているようColorSchemaです。

あなたのコードでは、このxmlは有効である可能性があります:

<Colors>
  <CombinedColors>
    <ColorSchema>
      <FooColor1>...</FooColor1>
      <FooColor2>...</FooColor2>
      <FooColor3>...</FooColor3>
      <FooColor4>...</FooColor4>
      <FooColor5>...</FooColor5>
    </ColorSchema>
  </CombinedColors>
</Colors>

xmlシリアル化におけるクラス名とプロパティ名の役割を誤解していると思います(xmlシリアル化の場合は[Serializable]属性は必要ありません)。

クラスをシリアル化する場合、xml要素名を作成するために使用されるのはプロパティ名です。タイプ名は使用されません(タイプがxmlルート要素の場合のみ)。

ノイズの多いxml要素のみを追加するような中間クラスを追加しないでください。

サンプルオブジェクトをシリアル化する小さなアプリを作成することで、シリアル化されたxmlをすばやく見つけることもできます。

于 2012-08-27T16:50:26.320 に答える
0

完全なプロパティ実装を使用する:このようなもの

private string _Name = "default value";
    public string Name
    {
        get { return _Name; }
        set { _Name=value;  }
    }

または、オブジェクトのコンストラクターを使用してデフォルト値を設定してみてください。

class YourClass
{
    public YourClass
    {
        //field default value goes here.
    }
}

これにより、null値が緩和されます。

お役に立てれば。

于 2012-08-27T15:01:01.700 に答える
0

これは私のxml->json->csharpが言うことです

public class Detailcolors
{
    public int foocolor1 { get; set; }
    public int foocolor2 { get; set; }
    public int foocolor3 { get; set; }
    public int foocolor4 { get; set; }
    public int foocolor5 { get; set; }
}

public class Colors
{
    public Detailcolors detailcolors { get; set; }
    public string goalcolors { get; set; }
}

public class RootObject
{
    public Colors colors { get; set; }
}
于 2012-08-27T16:56:06.493 に答える