2013-11-15 1 views
1

Я новичок в переполнении стека, прошу прощения, если этот вопрос уже предложен; Я везде искал, и ничего не мог найти. Наиболее родственный предмет был этотРасширения Protobuf-net? Могу ли я сериализовать специальные объекты по-другому?

Is there an extensibility mechanism in protobuf-net to control raw de/serialization?

Дело в том, я использую Protobuf внутрисетевые метод сериализации и я хотел бы, чтобы рассматривать некоторые объекты (специальные объекты по нескольким причинам), по-другому в сериализации/процесс десериализации.

Например, у меня есть что-то вроде класса Connection, который подключается к базе данных.

[ProtoContract] 
public class Connection 
{ 
    [ProtoMember(1)] 
    public SqlConnection myConnection {get; set} 

    public Connection(String connectionString) 
    { 
     this.myConnection = new SqlConnection(connectionString); 
    }   
} 

И я хотел бы сериализации этого класса, используя Protobuf-сеть, когда я пытаюсь сделать это нормально:

public void Serialize(Object instance, string path) 
{ 
    using (var stream = new FileStream(path, FileMode.Create)) 
    { 
     Serializer.Serialize(stream, instance); 
    } 
} 

public void someMethod() 
{ 
    Connection p = new Connection("user id=username;" + 
    "password=password;server=serverurl;" + 
    "Trusted_Connection=yes;" + 
    "database=database; " + 
    "connection timeout=30"); 

    Serialize(p);  
} 

я получаю исключение (это не совсем проблема) ... Скажем, я хотел бы рассматривать этот объект (SqlConnection) другим. Скажем, я хотел бы сериализовать его connectionString, а не сам объект, поэтому, когда я десериализую его, я могу снова подключиться к соответствующей базе данных ...

Я знаю, что могу сделать что-то вроде другого класса (тот, который он на самом деле будет сериализован), который содержит соответствующую информацию об особом объекте (в данном случае connectionString). Но это не то, что я ищу.

Это просто пример, у меня могут быть более сложные объекты, которые я хотел бы обрабатывать по-другому.

Поэтому мой вопрос: есть ли способ, которым я мог бы это достичь? Я читал о расширении, но я не совсем понимаю их.

Заранее спасибо.

ответ

0

В настоящий момент способ сделать это через «суррогат». В принципе, вы можете создать тип, как:

[ProtoContract] 
public class SqlConnectionDto 
{ 
    [ProtoMember(1)] 
    public string Server { get; set; } 
    [ProtoMember(2)] 
    public string Database { get; set; } 
    // ... 

    public static explicit operator SqlConnection(SqlConnectionDto dto) 
    { 
     if (dto == null) return null; 
     var builder = new SqlConnectionStringBuilder 
     { 
      DataSource = dto.Server, 
      InitialCatalog = dto.Database, 
      //... 
     }; 
     return new SqlConnection(builder.ConnectionString); 
    } 
    public static explicit operator SqlConnectionDto(SqlConnection conn) 
    { 
     if (conn == null) return null; 
     return new SqlConnectionDto 
     { 
      Server = conn.DataSource, 
      Database = conn.Database, 
      //... 
     }; 
    } 
} 

и сказать двигатель, чтобы использовать его:

RuntimeTypeModel.Default.Add(typeof(SqlConnection), false) 
    .SetSurrogate(typeof(SqlConnectionDto)); 

Однако он не в настоящее время предлагают полный контроль над сериализатором. Значения расширения действительно являются опцией, но без конкретного примера того, что вы пытаетесь сериализовать, сложно комментировать, будет ли это целесообразно.

+0

Большое спасибо, я запустил пример, и все работает отлично. Я думаю, что это будет достаточно хорошо для проекта, над которым я работаю. – user2996657

Смежные вопросы