Tôi có một vài phương thức mở rộng xử lý tuần tự các lớp của tôi, và vì nó có thể là một quá trình tốn thời gian, chúng được tạo ra một lần cho mỗi lớp và được đưa ra bằng phương pháp này.Nối tiếp WITHOUT xmlns
public static XmlSerializer GetSerializerFor(Type typeOfT)
{
if (!serializers.ContainsKey(typeOfT))
{
var xmlAttributes = new XmlAttributes();
var xmlAttributeOverrides = new XmlAttributeOverrides();
System.Diagnostics.Debug.WriteLine(string.Format("XmlSerializerFactory.GetSerializerFor(typeof({0}));", typeOfT));
xmlAttributes.Xmlns = false;
xmlAttributeOverrides.Add(typeOfT, xmlAttributes);
var newSerializer = new XmlSerializer(typeOfT, xmlAttributeOverrides);
serializers.Add(typeOfT, newSerializer);
}
return serializers[typeOfT];
}
này được gọi là theo phương pháp mở rộng .Serialize()
public static XElement Serialize(this object source)
{
try
{
var serializer = XmlSerializerFactory.GetSerializerFor(source.GetType());
var xdoc = new XDocument();
using (var writer = xdoc.CreateWriter())
{
serializer.Serialize(writer, source, new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") }));
}
return (xdoc.Document != null) ? xdoc.Document.Root : new XElement("Error", "Document Missing");
}
catch (Exception x)
{
return new XElement("Error", x.ToString());
}
}
Thật không may, khi Serializing lớp được tự động tạo ra, họ có thuộc tính XmlTypeAttribute(Namespace="http://tempuri.org/")
áp dụng đối với họ.
Điều này làm cho quá trình deserialization của các đối tác không được tạo tự động không thành công.
Tôi cần serializer để hoàn toàn bỏ qua và không áp dụng không gian tên, nhưng những gì tôi đã viết trong khối đầu tiên của mã dường như không để xoá bỏ nó, tôi vẫn kết thúc với xml như thế này
<Note>
<ID xmlns="http://tempuri.org/">12</ID>
<Author xmlns="http://tempuri.org/">
<ID>1234</ID>
<Type>Associate</Type>
<IsAvailable>false</IsAvailable>
</Author>
<Created xmlns="http://tempuri.org/">2010-06-22T09:38:01.5024351-05:00</Created>
<Text xmlns="http://tempuri.org/">This is an update</Text>
</Note>
Thay vì giống nhau, trừ thuộc tính xmlns="http://tempuri.org/"
.
Xin hãy trợ giúp, cảm ơn, điều này khiến tôi phát điên!
EDIT:
Tôi biết vấn đề, không phải cách khắc phục.
Lớp học của tôi không chỉ đầy các loại đơn giản.
Nó chứa các thuộc tính với các loại lớp khác. Cũng được tạo tự động với thuộc tính XmlTypeAttribute(Namespace = "http://tempuri.org/")
. Vì vậy, những gì đang xảy ra, là khi serialization xảy ra, và nó serializes các thuộc tính của lớp học của tôi, họ không đi qua serialization tùy chỉnh của tôi, và do đó, có thuộc tính áp dụng và không ghi đè.
Bây giờ tôi chỉ cần tìm ra cách để nhảy vòng đó. Bất kỳ suy nghĩ như thế nào?
EDIT 2:
Các công trình sau đây để serialize KHÔNG xmlns ... nhưng tôi đang gặp một vấn đề ở đầu deserialization, chỉ cần chưa chắc chắn nếu nó có liên quan hoặc không
public static XmlSerializer GetSerializerFor(Type typeOfT)
{
if (!serializers.ContainsKey(typeOfT))
{
var xmlAttributes = new XmlAttributes();
var xmlAttributeOverrides = new XmlAttributeOverrides();
System.Diagnostics.Debug.WriteLine(string.Format("XmlSerializerFactory.GetSerializerFor(typeof({0}));", typeOfT));
xmlAttributes.XmlType = new XmlTypeAttribute
{
Namespace = ""
};
xmlAttributes.Xmlns = false;
var types = new List<Type> {typeOfT, typeOfT.BaseType};
foreach (var property in typeOfT.GetProperties())
{
types.Add(property.PropertyType);
}
types.RemoveAll(t => t.ToString().StartsWith("System."));
foreach (var type in types)
{
xmlAttributeOverrides.Add(type, xmlAttributes);
}
var newSerializer = new XmlSerializer(typeOfT, xmlAttributeOverrides);
//var newSerializer = new XmlSerializer(typeOfT, xmlAttributeOverrides, extraTypes.ToArray(), new XmlRootAttribute(), string.Empty);
//var newSerializer = new XmlSerializer(typeOfT, string.Empty);
serializers.Add(typeOfT, newSerializer);
}
return serializers[typeOfT];
}
EDIT3 : Đã kết thúc sử dụng giải pháp từ How to remove all namespaces from XML with C#?
public static XElement RemoveAllNamespaces(this XElement source)
{
return !source.HasElements
? new XElement(source.Name.LocalName)
{
Value = source.Value
}
: new XElement(source.Name.LocalName, source.Elements().Select(el => RemoveAllNamespaces(el)));
}
giải pháp cuối cùng của bạn nên đã có tên 'RemoveAllAttributes' – redtetrahedron