Сохраните DataContract как XML в базе данных

Я создал решение, используя трубы, eval и сигнал.

parent() {
    if [ -z "$G_EVAL_FD" ]; then
            die 1 "Rode primeiro parent_setup no processo pai"
    fi
    if [ $(ppid) = "$" ]; then
            "$@"
    else
            kill -SIGUSR1 $
            echo "$@">&$G_EVAL_FD
    fi
}
parent_setup() {
    G_EVAL_FD=99
    tempfile=$(mktemp -u)
    mkfifo "$tempfile"
    eval "exec $G_EVAL_FD<>'$tempfile'"
    rm -f "$tempfile"
    trap "read CMD <&$G_EVAL_FD; eval \"\$CMD\"" USR1
}
parent_setup #on parent shell context
( A=1 ); echo $A # prints nothing
( parent A=1 ); echo $A # prints 1

Может работать с любой командой.

8
задан Robert 3 July 2009 в 04:22
поделиться

4 ответа

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

public static string Serialize<T>(T obj)
{
    StringBuilder sb = new StringBuilder();
    DataContractSerializer ser = new DataContractSerializer(typeof(T));
    ser.WriteObject(XmlWriter.Create(sb), obj);
    return sb.ToString();
}

Кстати, вы используете linq для sql? Причина, по которой я спрашиваю, связана с частью вашего вопроса XElement. в этом случае вы можете изменить это в дизайнере .dbml, чтобы использовать строку в качестве типа CLR, а не XElement по умолчанию.

12
ответ дан 5 December 2019 в 06:54
поделиться

Я не уверен в наиболее эффективном способе передать его в XElement, но чтобы передать его в строку, просто выполните:

DataContractSerializer serializer = new DataContractSerializer(typeof(Foo));
using (MemoryStream memStream = new MemoryStream())
{
    serializer.WriteObject(memStream, fooInstance);
    byte[] blob = memStream.ToArray();
}
1
ответ дан 5 December 2019 в 06:54
поделиться

If your database is SQL Server 2005 or above, you can use the XML data type:

private readonly DataContractToSerialize _testContract =
    new DataContractToSerialize
        {
            ID = 1,
            Name = "One",
            Children =
                {
                    new ChildClassToSerialize {ChildMember = "ChildOne"},
                    new ChildClassToSerialize {ChildMember = "ChildTwo"}
                }
        };

public void SerializeDataContract()
{
    using (var outputStream = new MemoryStream())
    {
        using (var writer = XmlWriter.Create(outputStream))
        {
            var serializer =
                new DataContractSerializer(_testContract.GetType());
            if (writer != null)
            {
                serializer.WriteObject(writer, _testContract);
            }
        }

        outputStream.Position = 0;
        using (
            var conn =
                new SqlConnection(Settings.Default.ConnectionString))
        {
            conn.Open();

            const string INSERT_COMMAND =
                @"INSERT INTO XmlStore (Data) VALUES (@Data)";
            using (var cmd = new SqlCommand(INSERT_COMMAND, conn))
            {
                using (var reader = XmlReader.Create(outputStream))
                {
                    var xml = new SqlXml(reader);

                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@Data", xml);
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}
2
ответ дан 5 December 2019 в 06:54
поделиться

Я пытался использовать функцию Jason w'Serialize, которая использует StringBuilder, но она возвращает пустую строку для класса таблиц, созданных LingToSQL Designer с атрибутом [DataContract()]

Однако если я сериализую в байтовый массив, как предложил AgileJon

и затем использую UTF7Encoding для преобразования в строку, это создает читаемую XML строку.

 static string DataContractSerializeUsingByteArray<T>(T obj)
    {
        string sRet = "";
        DataContractSerializer serializer = new DataContractSerializer(typeof(T)); 
        using (MemoryStream memStream = new MemoryStream()) 
        {
            serializer.WriteObject(memStream, obj); 
            byte[] blob = memStream.ToArray(); 
            var encoding= new System.Text.UTF7Encoding();
            sRet = encoding.GetString(blob);
        }
        return sRet;
    } 

Не уверен, почему решение stringBuilder не работает.

1
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: