私は小さなユーティリティクラスを持っています:
public static class SerializationUtilities
{
public static string ToXml<T>(T @object)
{
Contract.Requires<ArgumentNullException>(@object != null);
Contract.Requires<ArgumentException>(typeof(T).IsSerializable);
Contract.Ensures(!string.IsNullOrEmpty(Contract.Result<string>()));
var xs = new XmlSerializer(typeof(T));
var result = new StringBuilder();
using (var sw = new StringWriter(result))
{
xs.Serialize(sw, @object);
}
return result.ToString();
}
public static T FromXml<T>(string xml)
{
Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(xml));
Contract.Ensures(!object.Equals(Contract.Result<T>(), default(T)));
var xs = new XmlSerializer(typeof(T));
using (var sr = new StringReader(xml))
{
return (T)xs.Deserialize(sr);
}
}
}
2つの方法は期待どおりに機能しています。
ただし、コードコントラクト静的チェッカーは2つの警告をスローしています。
警告30CodeContracts:証明されていないことを保証します:!string.IsNullOrEmpty(Contract.Result())
警告28CodeContracts:証明されていないことを保証します:!object.Equals(Contract.Result()、default(T))
なぜこれらの警告が発せられるのですか?私の方法を契約するための正しい(最良の)方法は何ですか?