2

次のようなコードで動的オブジェクトのクローンを作成する際に問題があります。

    public void Execute(IPrepareData entity)
    {
        try
        {                
            dynamic data = entity.Primary as dynamic;
            data.PreviousInfo = deepClone(data.Info);
        }
        catch (Exception ex)
        {
            data.Errors.Add(ex.Message);
        }
    }

    private static T deepClone<T>(T obj)
    {
        if (typeof(T).IsClass || typeof(T).IsArray)
        {
            if (ReferenceEquals(obj, null))
            {
                return default(T);
            }
        }
        using (var memoryStream = new MemoryStream())
        {
            BinaryFormatter fieldFormatter = new BinaryFormatter();
            fieldFormatter.Serialize(memoryStream, obj);
            memoryStream.Position = 0;
            return (T)fieldFormatter.Deserialize(memoryStream);
        }
    }

    dynamic data;

エンティティの構造を事前に知りません (情報が含まれるということだけで、情報の構造はわかりません)、シリアライズ可能とマークされません。この情報をエンティティの以前の情報セクションにコピーする必要があります。

このコードの実行結果は、fieldFormatter.Serialize 行の「オブジェクト参照がオブジェクトのインスタンスに設定されていません」です。

オブジェクトのインスタンスかどうかを確認するにはどうすればよいですか?

循環参照が存在する可能性があります (おそらく存在する可能性があります)。そのため、対処方法がわからないため、リフレクションを試みていません。また、速度も問題ありません。

4

3 に答える 3

3

データがシリアル化可能としてマークされることがわからない場合は、の使用に依存することはできませんBinaryFormatter

オブジェクトに循環参照がある可能性が高い場合、他の多くのシリアライザーは問題外です。

それが(だけでなく)の一般的なケースであると仮定すると、メンバーは照会されたときに発明できるため、メンバーに関する情報を取得する方法はありません。dynamicExpandoObject

基本的に、このシナリオには*良い答えはありません。「モノ」を単にディープクローンする魔法の方法はありません。

于 2012-09-26T12:58:32.333 に答える
0

ユーザー定義型のシリアル化にJSON.netを使用しており、うまく機能しています。

null プロパティを無視するフラグがあります。または、デフォルトで名前を付けて保存します。

{propname: 'undefined'}

速度は問題ではないとおっしゃっていましたが、シリアライザーは非常に高速です。

これがナゲットパッケージです。

于 2013-05-10T02:02:45.627 に答える