コードレビューについて、C#、List<T>やジェネリックな配列をXmlシリアライズ・デシリアライズする拡張メソッド


自分でC#でListやT[]をXmlシリアライズ・デシリアライズする拡張メソッドを書いたのですが、例外処理はどうすればいいのか（使う側で定義するのか使われる側で定義するのか等）と、あと書き方について指摘を頂きたいです。よろしくお願いします。

[code]

       ///<summary> Xmlをジェネリックな配列に読み込むメソッド </summary> 
        public static void LoadXml<T>(this T[] list, string path)
        {
            T[] xmldata = null;
    
            XmlDocument xdoc = new System.Xml.XmlDocument();
            XmlSerializer xml = new System.Xml.Serialization.XmlSerializer(typeof(T[]));
    
            xdoc.PreserveWhitespace = true;
            xdoc.Load(path);
    
            XmlNodeReader xnr = new System.Xml.XmlNodeReader(xdoc.DocumentElement);
    
            xmldata = (T[])xml.Deserialize(xnr);
    
            for (int i = 0; i < xmldata.Length; i++)
                list[i] = xmldata[i];
        }
    
        ///<summary> XmlをList<T>に読み込むメソッド </summary>
        public static void LoadXml<T>(this List<T> list, string path)
        {
            list.Clear();
    
            T[] xmldata = null;
    
            XmlDocument xdoc = new System.Xml.XmlDocument();
            XmlSerializer xml = new System.Xml.Serialization.XmlSerializer(typeof(T[]));
    
            xdoc.PreserveWhitespace = true;
            xdoc.Load(path);
    
            XmlNodeReader xnr = new System.Xml.XmlNodeReader(xdoc.DocumentElement);
    
            xmldata = (T[])xml.Deserialize(xnr);
    
            for (int i = 0; i < xmldata.Length; i++)
                list.Add(xmldata[i]);
        }
    
        /// <summary> ジェネリックな配列をXmlにセーブするメソッド </summary>
        public static void SaveXml<T>(this T[] list, string path)
        {
            T[] xmldata = null;
            xmldata = list.ToArray();
    
            using (FileStream fs = new FileStream(path, FileMode.Create))
            {
                XmlSerializer xml = new XmlSerializer(typeof(T[]));
    
                xml.Serialize(fs, xmldata);
            }
        }
    
        /// <summary> List<T>オブジェクトをXmlにセーブするメソッド </summary>
        public static void SaveXml<T>(this List<T> list, string path)
        {
            T[] xmldata = null;
            xmldata = list.ToArray();
    
            using (FileStream fs = new FileStream(path, FileMode.Create))
            {
                XmlSerializer xml = new XmlSerializer(typeof(T[]));
    
                xml.Serialize(fs, xmldata);
            }
        }
    }
    
[/code]




まず`SaveXml`ですが、`T[]`と`List<T>`の２バージョン記述するのは冗長で不毛です。両クラスが共通して実装しているインターフェースに対する拡張メソッドにすることでコードを統一できます。  
同様に`LoadXml`も２バージョン記述されていて冗長ですが、それ以前に`T[]`と`List<T>`を第１引数に要求する意義がなく、新規のオブジェクトを作成しそれを返すべきです。つまり拡張メソッドであること自体が不適切です。  
これらを踏まえると次のように記述できるでしょうか。

[code]

    public static class XmlUtil {
        public static T[] LoadFrom<T>(string path) {
            var serializer = new XmlSerializer(typeof(T[]));
            using (var stream = File.OpenRead(path))
                return (T[])serializer.Deserialize(stream);
        }
    
        public static void SaveTo<T>(this IEnumerable<T> source, string path) {
            var serializer = new XmlSerializer(typeof(T[]));
            using (var stream = File.OpenWrite(path))
                serializer.Serialize(stream, source as T[] ?? source.ToArray());
        }
    }
    
[/code]

* * *

例外処理については何を懸念されているのかわかりませんでした。  
気になる点として、`XmlSerializer`の他にも`DataContractSerializer`がありシリアル化方法なども異なりますが、利用者には選択権がありません。これに限らずどのようにシリアル化されるかの責務はメソッド側となってしまい、利用者は制御できないわけですが、それでいいのでしょうか。

