2009-07-30 7 views
0

に属性私は次のXMLスニペットを持っている:私は希望何シリアライゼーション、強いtypeプロパティ

<Configuration> 
    <Config name="SendToAddresses"></Config> 
    <Config name="CCToAddresses"></Config> 
    <Config name="BCCAddresses"></Config> 
</Configuration> 

が配列含む値のペアの設定のすべての項目で、強く型付けされたクラスにデシリアライズすることです(名|値)。

答えて

4
class Program 
{ 
    static void Main(string[] args) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Configuration)); 
     var xml = 
@"<Configuration> 
    <Config name=""SendToAddresses"">some value</Config> 
    <Config name=""CCToAddresses""></Config> 
    <Config name=""BCCAddresses""></Config> 
    </Configuration>"; 
     using (var reader = new StringReader(xml)) 
     { 
      var configuration = (Configuration)serializer.Deserialize(reader); 
     } 
    } 
} 

public class Configuration 
{ 
    [XmlElement(ElementName="Config")] 
    public Config[] Configs { get; set; } 

} 

public class Config 
{ 
    [XmlAttribute(AttributeName = "name")] 
    public string Name { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 
0

強力な型を取得するには、各XMLノードの定義と型を含むXSDファイルであるXMLスキーマを作成する必要があります。 これについてはMSDN documentationをご覧ください。

+0

おかげで、私は何を意味するかではないthatsの。私がしたいのは、C#クラスにdeSerializeを行うことですが、単にConfigのコレクションを持つ代わりに、何らかの形で要素のname属性も取得する必要があります。 –

+0

恐らくこれが役に立ちます http://stackoverflow.com/questions/1081325/c-how-to-xml-deserialize-object-itself もう一度、正しく実行したい場合は、スキーマを使用してください。 – Sorantis

0

あなたが探して何これです:

[XmlRoot("Configuration")] 
    public class Configuration 
    { 
     [XmlElement("Config")] 
     public List<Config> Configs { get; set; } 
    } 

    public class Config 
    { 
     [XmlAttribute("name")] 
     public string Name { get; set; } 
     [XmlText] 
     public string Value { get; set; } 

     public Config() { } 
    } 

    // ... 

    XmlSerializer s = new XmlSerializer(typeof(Configuration)); 
    Configuration conf = (Configuration)s.Deserialize(new StringReader("INSERTXMLHERE")); 

    foreach (var config in conf.Configs) 
    { 
     Console.WriteLine("{0} = {1}", config.Name, config.Value); 
    } 
0

設定の配列を持つように強く型付けされたオブジェクトにxmlファイルをデシリアライズするためにはポイントがありません。

あなたがあなたのxmlファイルを変更する余裕がある場合は、次の

<Configuration> 
    <SendToAddresses></SendToAddresses> 
    <CCToAddresses></CCToAddresses> 
    <BCCAddresses></BCCAddresses> 
</Configuration> 

、以下の簡単な手順は、次のとおりです。

  1. まず、あなたにあなたのオブジェクトをデシリアライズするために、コンテナ(オブジェクト)が必要です。
  2. XSD.exeもあなた用のファイルを生成します(XSDスキーマ、次にXSDスキーマのCSファイル)。

XSD.exeを使用すると、15分以内に設定され、厳密に型指定された設定オブジェクトが作成されます。

0

あなたが解決しようとしている問題は、すでにSystem.Configuration名前空間で解決されていると思いますか?

私はジョンRistaによってコードプロジェクトにthis articleを考えるには、コンフィギュレーション・クラスを使用すると、あなたが探しているものを達成役立つはずどのように偉大な概要を説明します。それはあなたがあなたがあなたのconfigクラスを含むアセンブリを作成できるようになりますあなたのプロジェクトのために、シリアル化アセンブリを行うことを検討することをお勧めします必要が正確に何でないなら

コンパイル時にデシリアライザとシリアライザのクラスを作成しなかったときに、デシリアライズとシリアライゼーションの問題が発生しました。時間の経過とともに、実行時に作成されるXmlSerializationクラスが常に作成されたり使用可能であるとは限りません。エラーが発生します。

これを行う最も簡単な方法は、新しいアセンブリプロジェクトを作成し、公共の読み取り/書き込みプロパティでシリアライズ()クラスを追加することです。そして、あなたがそうのようなイベントを構築するポストにシリアライザアセンブリを作成するためにSGENを使用することができます...

SGEN/A:$(TargetFileName)/力/

をVERBOSE次に、あなたのSerializableのアセンブリを参照する必要がありますAssemblyName.Serializable.Serializersがビンまたはプロービングパスで使用可能である限り、実行時に動的アセンブリが作成されず、エラーが発生することはありません。

これが完了すると、シリアライゼーションアセンブリに含まれている型をシリアル化およびデシリアライズできます。

シリアライズ....

IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly(); 
using (IsolatedStorageFileStream stream = new 
    IsolatedStorageFileStream(key, FileMode.Create, isolatedStorage)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    serializer.Serialize(stream, value); 
} 

デシリアライズ

using (IsolatedStorageFile isolatedStorage = 
    IsolatedStorageFile.GetUserStoreForAssembly()) 
{ 
    using (IsolatedStorageFileStream stream = 
     new IsolatedStorageFileStream(
     key, FileMode.OpenOrCreate, FileAccess.ReadWrite, isolatedStorage)) 
    { 
     if (stream.Length > 0) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      return (T)serializer.Deserialize(stream); 
     } 
     else 
     { 
      return default(T); 
     } 

    } 
} 
関連する問題