エイリアスのアプローチ属性は保存されていますが、オーバーヘッドが大きすぎます(ファイルごとなど)。
タイプレベルは属性genercally保存ある - それは、属性に依存 - [Serializable]
ため、それが持っていることに注意してください。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct
| AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)]
Inherited = false
が重要であること - すなわち、それが継承されていません。
は個人的に私はおそらく最初の例で働いて直列化のctor /コールバックを得ることに集中しているだろう - 私はそれがはるかに多くの努力を必要としていることはないだろう。以下は罰金だ:
[Serializable]
public class Foo: Dictionary<string, string> {
public Foo() : base() { }
public Foo(SerializationInfo info, StreamingContext context) : base(info, context) { }
public Foo(int capacity) : base(capacity) { }
public Foo(IEqualityComparer<string> comparer): base(comparer) {}
public Foo(IDictionary<string,string> dictionary) : base(dictionary) { }
public Foo(int capacity, IEqualityComparer<string> comparer) : base(capacity, comparer) { }
public Foo(IDictionary<string, string> dictionary, IEqualityComparer<string> comparer) : base(dictionary, comparer) { }
}
はしかし、ここでカプセル化を介した代替です:「辞書は、すでに直列化復元することができたときに少し愚かなことでしょう」
[Serializable]
public class Foo : IDictionary<string,string>
{
private readonly Dictionary<string, string> inner = new Dictionary<string, string>();
public void Add(string key, string value)
{
inner.Add(key, value);
}
public bool ContainsKey(string key)
{
return inner.ContainsKey(key);
}
public ICollection<string> Keys
{
get { return inner.Keys; }
}
public bool Remove(string key)
{
return inner.Remove(key);
}
public bool TryGetValue(string key, out string value)
{
return inner.TryGetValue(key, out value);
}
public ICollection<string> Values
{
get { return inner.Values; }
}
public string this[string key]
{
get
{
return inner[key];
}
set
{
inner[key] = value;
}
}
void ICollection<KeyValuePair<string, string>>.Add(KeyValuePair<string, string> item)
{
((IDictionary<string,string>)inner).Add(item);
}
public void Clear()
{
inner.Clear();
}
bool ICollection<KeyValuePair<string, string>>.Contains(KeyValuePair<string, string> item)
{
return ((IDictionary<string, string>)inner).Contains(item);
}
void ICollection<KeyValuePair<string, string>>.CopyTo(KeyValuePair<string, string>[] array, int arrayIndex)
{
((IDictionary<string, string>)inner).CopyTo(array, arrayIndex);
}
public int Count
{
get { return inner.Count; }
}
bool ICollection<KeyValuePair<string, string>>.IsReadOnly
{
get { return ((IDictionary<string, string>)inner).IsReadOnly; }
}
bool ICollection<KeyValuePair<string, string>>.Remove(KeyValuePair<string, string> item)
{
return ((IDictionary<string, string>)inner).Remove(item);
}
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
{
return inner.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return inner.GetEnumerator();
}
}
を私はそれが(ほとんど)どのような場合には、ベースのctorを呼び出すために愚かだと言うではないでしょう+それが1分の努力だので、私はそれを行うでしょうねエイリアスが必要ですか?あなたは何の問題を解決しようとしていますか? –
エイリアスを必要とする一般的な理由:必要に応じてクラスを後で簡単に作ることができるように、そして人々がそれを間違ったタイプの辞書として扱おうとはしないようにします。編集:また、私は文字列以外のものに簡単にキーや値を変更する必要がある場合は、その簡単です。 – Drew
これは 'BinaryFormatter'シリアル化ですか?それとも? –