Je travaille sur une sorte d'application de stockage et de transfert pour les services WCF. Je veux enregistrer le message dans une base de données en tant que blob XML brut, comme XElement. J'ai un peu de mal à convertir le datacontract en le type XElement dont j'ai besoin pour l'appel de la base de données. Des idées?Conserver un contrat DataContract en tant que XML dans une base de données
Répondre
cela, il revient en tant que chaîne, que vous pouvez mettre en le db dans une colonne xml. Voici une bonne méthode générique que vous pouvez utiliser pour sérialiser les contrats de données.
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();
}
btw, utilisez-vous linq à sql? La raison pour laquelle je demande est à cause de la partie XElement de votre question. Si c'est le cas, vous pouvez le modifier dans le concepteur .dbml pour utiliser une chaîne comme type CLR, et non XElement par défaut.
Cela n'a pas fonctionné pour moi. Voir la réponse de user224125 ci-dessous. –
Je ne suis pas sûr de la façon la plus efficace pour obtenir un XElement, mais pour obtenir une chaîne à courir juste:
DataContractSerializer serializer = new DataContractSerializer(typeof(Foo));
using (MemoryStream memStream = new MemoryStream())
{
serializer.WriteObject(memStream, fooInstance);
byte[] blob = memStream.ToArray();
}
Si votre base de données est SQL Server 2005 ou au-dessus, vous pouvez utiliser le type de données XML:
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();
}
}
}
}
}
J'ai essayé d'utiliser la fonction Jason w'Serialize qui utilise StringBuilder, mais il retourne une chaîne vide pour LingToSQL Designer classe de table générée avec [DataContract()] attribut
Toutefois, si je serialze à tableau d'octets comme suggéré par AgileJon
puis utilisez UTF7Encoding pour convertir en chaîne, il crée chaîne XML lisible.
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;
}
Vous ne savez pas pourquoi la solution stringBuilder ne fonctionne pas.
La réponse la plus votée (Jason W. posté) n'a pas fonctionné pour moi. Je ne sais pas pourquoi cette réponse a obtenu le plus de votes. Mais après la recherche autour J'ai trouvé ce
http://billrob.com/archive/2010/02/09/datacontractserializer-converting-objects-to-xml-string.aspx
qui a travaillé pour mon projet. J'ai juste eu quelques classes et ai placé les attributs de datacontract et de datamemeber sur des classes et des propriétés et a voulu alors obtenir une chaîne XML que je pourrais écrire dans la base de données.
code à partir du lien ci-dessus Incase il va 404:
Sérialise:
var serializer = new DataContractSerializer(tempData.GetType());
using (var backing = new System.IO.StringWriter())
using (var writer = new System.Xml.XmlTextWriter(backing))
{
serializer.WriteObject(writer, tempData);
data.XmlData = backing.ToString();
}
Désérialise:
var serializer = new DataContractSerializer(typeof(T));
using (var backing = new System.IO.StringReader(data.XmlData))
using (var reader = new System.Xml.XmlTextReader(backing))
{
return serializer.ReadObject(reader) as T;
}
Merci pour le lien. –
- 1. Fichier XML en tant que base de données?
- 2. WCF DataContract
- 3. typedef en tant que type de données de base
- 4. Choisir la base de données FILEGROWTH en tant que% ou en tant que Taille fixe
- 5. Logiciel en tant que service - Base de données
- 6. Transmettre une variable au nom complet en tant que base de données dans une requête SQL
- 7. Stockez le fichier de configuration XML dans la base de données en tant que champ ou stockez-en le chemin?
- 8. WCF DataContract
- 9. YAML en tant que DSL de données dans .NET (C#)
- 10. Comment insérer/récupérer un fichier stocké en tant que BLOB dans une base de données MySQL en utilisant python
- 11. pour conserver l'ordre des colonnes FLEX Datagrid en tant que fournisseur de données?
- 12. Base de données en tant que référentiel de données de jeu?
- 13. Impossible d'enregistrer .doc en tant que .xml
- 14. SQL Server 2008 en tant que base de documents de document xml
- 15. Créer document XML en utilisant C# avec SQL Server en tant que source de données
- 16. Modification de XML en tant que dictionnaire en python?
- 17. Un diagramme de classes est à un programme en tant que ________ est à une base de données?
- 18. Comment sauvegarder et restaurer une base de données en tant que copie sur le même serveur?
- 19. Utiliser .NET pour obtenir des données d'Excel en tant que base de données
- 20. Comment envoyer des données XML en tant que requête à l'aide du service Web XML
- 21. Encoder les valeurs des colonnes xml en tant que xml dans le serveur SQL
- 22. Devrais-je conserver un fichier sous forme de texte ou l'importer dans une base de données?
- 23. Dois-je décorer mes classes/propriétés en tant que DataContract/DataMember lorsque je les utilise dans WCF?
- 24. Comment convertir une base de données MySQL en XML?
- 25. Comment convertir un fichier XML en base de données?
- 26. castle windsor: comment utiliser un type en tant que propriété constructeur dans une config xml?
- 27. conserver les paramètres dans la base de données
- 28. Sélection de noeuds XML en tant que lignes
- 29. Fichier texte en tant que source de données dans SSRS
- 30. PHP XML-Export en tant que téléchargement de fichier
XElement n'est pas la même chose que "blob XML brut". Le premier est un type, pratique pour faire cela avec XML. L'autre est une chaîne avec un format particulier. Vous pouvez enregistrer à partir de n'importe quel type décoré avec [DataContract] dans la chaîne XML. (Voir ci-dessous pour des exemples). Le XElement - vous pouvez vous asseoir sur votre crédence, vous n'en avez pas besoin. – Cheeso