WCF hizmetleri için bir tür "depola ve ilet" uygulaması üzerinde çalışıyorum. İletiyi bir veritabanında XElement olarak ham XML blob olarak kaydetmek istiyorum. Veri kontratını, veritabanı çağrısı için ihtiyacım olan XElement türüne dönüştürmede biraz sorun yaşıyorum. Herhangi bir fikir?DataContract veritabanında XML olarak devam et
cevap
bu içine koyabilirsiniz bir dize olarak döndürür db bir xml sütununa. Veri kontekstlerini serileştirmek için kullanabileceğiniz iyi bir genel yöntem.
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, linq to sql kullanıyor musunuz? Sormamın nedeni, sorunuzun XElement bölümünden kaynaklanıyor. Bu durumda, .dbml tasarımcısında, bir dizeyi CLR türü olarak kullanmak için değiştirebilir ve varsayılan XElement'i değiştiremezsiniz. veritabanı SQL Server 2005 veya üzerinde ise
Bu benim için çalışmadı. Aşağıdan kullanıcı224125'in cevabına bakınız. –
Bir XElement için bunu elde etmek için en etkili yol hakkında emin değilim, ama bir dizeye almak için sadece çalıştırın:
DataContractSerializer serializer = new DataContractSerializer(typeof(Foo));
using (MemoryStream memStream = new MemoryStream())
{
serializer.WriteObject(memStream, fooInstance);
byte[] blob = memStream.ToArray();
}
, XML veri türünü kullanabilirsiniz:
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();
}
}
}
}
}
ben StringBuilder kullanan Jason w'Serialize işlevini kullanmaya çalıştı ama LingToSQL Designer için boş bir dize döndürür [DataContract()]
bağlıyor Ancak AgileJon
önerdiği ve daha sonra dizeye dönüştürmek için UTF7Encoding kullanmak gibi bayt dizisine serialze eğer, yarattığı okunabilir XML dizesiyle oluşturulan tablo sınıfı .
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;
}
Neden StringBuilder çözümünün çalışmadığından emin değil.
En çok oylanan cevap (Jason W. yayınlanmıştır) benim için çalışmadı. Bu cevabın neden en çok oyu aldığını bilmiyorum. Ama etrafında arama yaptıktan sonra Projem için çalıştı bu
http://billrob.com/archive/2010/02/09/datacontractserializer-converting-objects-to-xml-string.aspx
bulundu. Sadece birkaç sınıfım vardı ve veri kontratı ve datamemeber özelliklerini sınıflar ve özellikler üzerine koyup veritabanına yazabileceğim bir XML dizisi almak istedim. o 404 gider yukarıdaki örtmek bağlantıdan
Kodu:
serializes:
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();
}
deserializes:
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;
}
Bağlantı için teşekkürler. –
- 1. İşleve devam et & && işlev bildirimi
- 2. MapBox İşaretçileri yakınlaştırmaya devam et
- 3. Android içinde etkinliği devam et
- 4. WebStorm, JSX'i XML olarak işleme devam ediyor
- 5. DataContract Serializer Metadata'da XML Yorumları İçeren
- 6. Magento için 'Ödeme İşlemine Devam Et' Olayı?
- 7. jQuery - varsayılanı engelle, sonra da varsayılan olarak devam et
- 8. Python: oyuna devam edildikten sonra devam et py2exe
- 9. WCF DataContract ile DataContract Arabirimi
- 10. Android Service Marshmallow'ta Durmaya Devam Et
- 11. WCF DataContract DataMember siparişi?
- 12. Alıcı, gönderici durduktan sonra çalışmaya devam et
- 13. Taklit edemiyorum, hata almaya devam et
- 14. HtmlAgility - Bir dizeye ayrıştırma işlemine devam et
- 15. Kullanıcı mod_wsgi kullanarak oturum açmaya devam et
- 16. Belirli Bir Döngüden Eğitime Devam Et
- 17. varlık Framework nesnesini xml'ye doğru devam et
- 18. Kesintiden sonra GHC'de hata ayıklamaya devam et
- 19. DataContract ve XmlType
- 20. WCF'deki enansörler için DataContract
- 21. Kök ayrıcalıklarını düşürme ve yine de kümelenmeler oluşturmaya devam et
- 22. Django Kereviz İş Akışı Zinciri Duraklat/Devam Et
- 23. Async/task.run vs görev.run ve .NET 4.0 ile devam et
- 24. jQuery (Kaydırma ve Dokunma) SayfaX ve sayfaY devam et 0
- 25. Devam ettikten ve yeniden açtıktan sonra HTML formunu doldurmaya devam et
- 26. WCF - DataMember DataContract
- 27. Django: çevrilmiş dizeleri oluştururken tembelli çeviri yapmaya devam et
- 28. Vertx: PDF dosyasını kapattıktan sonra canlı kalmaya devam et
- 29. Nasıl angular-cli live web sunucumla çalışmaya devam et
- 30. Python: Hata mesajını atla ve python döngüsünde devam et?
XElement "ham xml blob" aynı şey değildir. Eski, XML ile bunu yapmak için kullanışlı bir türdür. Diğeri, belirli bir biçime sahip bir dizedir. [DataContract] ile dekore edilmiş herhangi bir türden XML dizesine kaydedebilirsiniz. (Örnekler için aşağıya bakınız). XElement - bunu credenza'da oturabilirsin, buna ihtiyacın yok. – Cheeso