2016-04-19 13 views
0

私は、これらのインタフェースを持っている:XML汎用クラスにシリアル化するには?

public interface IParameter 
{ 
    string Name { get; } 
    object UntypedValue { get; set; } 
} 
public interface IValidationPolicy<T> 
{ 
    bool Validate(T toValidate); 
    T Default(); 
} 

パラメータベースクラス

[Serializable] 
public abstract class ParameterBase : IParameter 
{ 
    public abstract string Name { get; protected set; } 
    public abstract object UntypedValue { get; set; } 
} 

パラメータ具象クラス(私はより多くを持っているが、それらは非常に似ている):

public class Parameter<T, V> : ParameterBase where V : IValidationPolicy<T> 
{ 
    [XmlAttribute("Name")] 
    public override string Name { get; protected set; } 

    [XmlIgnore] 
    protected V validation_policy_; 
    [XmlElement("AnyValidation", Type = typeof(AnyValidation<>))] 
    [XmlElement("MultiOptionsValidation", Type = typeof(MultiOptionsValidation<>))] 
    [XmlElement("RangeValidation", Type = typeof(RangeValidation<>))] 
    [XmlElement("TextValidation", Type = typeof(TextValidation))] 
    public V Validation 
    { 
     get 
     { 
      return validation_policy_; 
     } 
    } 

    [XmlIgnore] 
    protected T value_; 
    [XmlElement("Value")] 
    public T Value 
    { 
     get 
     { 
      return value_; 
     } 
     set 
     { 
      if (validation_policy_.Validate(value)) 
      { 
       value_ = value; 
      } 
     } 
    } 

    [XmlIgnore] 
    public object UntypedValue 
    { 
     get 
     { 
      return Value; 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

とXMLParameterクラス:

public class XMLParameter : INotifyPropertyChanged 
{   
    public string Description { get; set; } 
    public int PasswordLevel { get; set; } 
    public bool Enabled { get; set; } 
    public ParameterBase Parameter { get; set; } 
} 

XMLParametersのリストをシリアル化して逆シリアル化するにはどうすればよいですか?

特に、私はIParameterオブジェクトのシリアライズに問題があります。

インタフェースは最初の試みとして直列化できないため、基本抽象クラスParameterBaseを作成し、それからParameterを導きます。 しかし、私は試験方法でそれをシリアル化しようとすると:私は例外だ

var validation = new RangeValidation<int>() { MinValue = 1, MaxValue = 6 }; 
var parameter = new Parameter<int, RangeValidation<int>>(); 
parameter.Initialize("NumberOfTrays", validation); 
parameter.Value = 6; 

XElement par = validation.ToXElement<Parameter<int, RangeValidation<int>>>(); 

:タイプの反射でエラーが 'ConfigurableLibray.Parameter'2[System.Int32,ConfigurableLibray.RangeValidation'1[System.Int32]]'

内部例外がConfigurableLibray.Parameter'2[T,V]

何午前にサポートされていないことを言います私は間違っている?

ご協力ありがとうございます。

+1

http://stackoverflow.com/questions/17011633/xml-serialize-a-generic-class-with-its-generic-types – CathalMF

+0

こんにちはCathalMF。私が正しく理解していれば、彼の問題はタイプタイプの2つのプロパティでした。私は自分のクラスにType型のプロパティを持っていません。私は正しい? – Michele

+1

はい、方法は同じです。クラスに属性を追加する必要があります。あなたの問題は、シリアライザがあなたのオブジェクトが何であるか分かりません。ルートと属性などを指定することで、XMLの内容とその表現方法を指定する必要があります。 – CathalMF

答えて

0

リフレクションを使用してクラスのシリアル化と逆シリアル化を手動で実装する方法を解決しました。

関連する問題