Linq to Sql - Невозможно сделать глубокую копию объекта L2S - PullRequest
0 голосов
/ 16 марта 2011

Я пытаюсь сделать глубокую копию объекта L2S, используя приведенный ниже код.У меня режим сериализации .DBML установлен на однонаправленный.Однако, когда я пытаюсь сделать глубокую копию объекта L2S, используя метод DeepCopy, показанный ниже, я получаю сообщение об ошибке, в котором говорится, что объект не помечен как сериализуемый.Кто-нибудь знает почему?

public static T DeepCopy<T>(T obj)
{
    object result = null;

    using (var ms = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(ms, obj);
        ms.Position = 0;

        result = (T)formatter.Deserialize(ms);
        ms.Close();
    }

    return (T)result;
}

Одно из моих определений классов L2S выглядит следующим образом:

[global::System.Data.Linq.Mapping.TableAttribute(Name="Polar.Recipe")]
[global::System.Runtime.Serialization.DataContractAttribute()]
public partial class RecipeRecord : INotifyPropertyChanging, INotifyPropertyChanged

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Атрибут DataContract требуется для DataContractSerializer, но он не будет работать с другими сериализаторами, такими как BinarySerializer, ViewStateSerializer и другими сериализаторами.Чтобы заставить их работать, вы должны использовать атрибут Serializable, чтобы применить их.Теперь, как это сделать легко ...

Когда я хочу расширить свои сущности Linq2Sql, я обычно злоупотребляю тем фактом, что они являются ВСЕМИ частичными классами.Поэтому я создаю файл Linq2SqlExtensions.cs

public partial class LinqEntity
{
//extensions go here
}

и другие расширения (например, расширения контекста данных).Теперь, если у вас много сущностей, вы можете написать небольшую программу (даже в powershell) для извлечения всех имен классов из вашего пространства имен / сборок Linq2Sql (молю, у вас они есть в другой сборке), создать этот файл для вас и автоматически обновить его дляВы каждый раз запускаете его из командной строки VisualStudio (или сценария msBuild).

что-то вроде

var entities = Assembly.Load("MyLinqAssembly").GetTypes().Where(p=> p.IsDefined(typeof(TableAttribute), true));
WriteEntityCsFile(entities);
0 голосов
/ 16 марта 2011

Вы пытались добавить атрибут Serializable к своим классам сущностей?Возможно, атрибут DataContract разрешает сериализацию только через WCF и другие коммуникационные сервисы и не использует BinaryFormatter.

В качестве альтернативы попробуйте использовать DataContractSerializer вместо BinaryFormatter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...