2009-07-12 22 views
8

Çok satırlı girişi kabul eden [XmlText] ile işaretlenmiş bir özelliğe sahip bir sınıfım var. XML dosyamda, metin içeriğinin içindeki satır sonlarının, dosyanın geri kalanıyla aynı olan "\r\n" numaralı enfact olduğunu doğruladım. [XmlText] özellik için setter içinde value zaten biten bir çizgi olarak "\n" sahiptirXML serileştirme 'standartlaştırmak' satır sonları, nasıl durdurulur? (.NET)

XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList)); 
string file = "test.xml"; 

if (File.Exists(file)) 
{ 
    using (TextReader r = new StreamReader(file)) 
    { 
     foo = configSerializer.Deserialize(r); 
    } 
} 

Ama:

Ben serisini kullanıyorum kodudur. Bu can sıkıcı olmasının temel nedeni,numaralı telefon hattında düzgün bir şekilde görüntülenememesi nedeniyle "\n" ... hangi bölümün problemlere neden olduğundan emin değilim, ama buradaki bir kişinin duruma ışık tutabileceğini düşündüm. . Eğer seri olsaydı

cevap

10

Ben daha hızlı bir şekilde, bir C# geliştirme ortamına kod koymak için yapmak örnek kodunu değiştirmek ettik. Ayrıca kasıtlı olarak ifadeleri kullanarak dahil etmedim - sadece örnek kod. Biz seri ve idam olmaz çıktısı alır "Aynı" satırı tanımlamak şekilde bu serisini denerseniz

public class DataToSerialize 
    { 
     public string Name { get; set; } 
    } 

: Biz takip sınıf var Örneğin

biz seri isteyen (Ben ile değiştirin, kod Environment.NewLine ile Windows üzerinde çalışır farz ediyorum "\ r \ n" sen değilse):

DataToSerialize test = new DataToSerialize(); 
    test.Name = "TestData" + Environment.NewLine; 
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize)); 
    MemoryStream ms = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(ms); 
    configSerializer.Serialize(sw, test); 
    ms.Position = 0; 
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(ms); 
    if (deserialized.Name.Equals("TestData" + Environment.NewLine)) 
    { 
     Console.WriteLine("Same"); 
    } 

Ancak bu el bir XmlTextReader atayarak, sabitlenebilir serializer, Normalization özelliği false olarak ayarlanmış (tek kullanımlık serileştiriciye varsayılan olarak d) true olarak ayarlanır:

DataToSerialize test = new DataToSerialize(); 
    test.Name = "TestData" + Environment.NewLine; 
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize)); 
    MemoryStream ms = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(ms); 

    configSerializer.Serialize(sw, test); 
    ms.Position = 0; 
    XmlTextReader reader = new XmlTextReader(ms); 
    reader.Normalization = false; 
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(reader); 
    if (deserialized.Name.Equals("TestData" + Environment.NewLine)) 
    { 
     Console.WriteLine("Same"); 
    } 

aynı anda çıktısını olacak ki ben davranışı size gereken yanlış olmazsam?

+1

Bunu seviyorum; -p –

+2

Ancak, kayıt için örnek koddaki ifadelerin kullanılmaması benim fikrimi okumayı zorlaştırıyor ... kullanımında yanlış bir şey yok. –

+0

@ Matthew- Sanırım bu, öznel bir şeydir - birinin diğerinden daha iyi olduğunu kanıtlamak için kontrollü bir deney gerçekleştirmeniz gerekiyor. Benim cevabımla, MemoryStream'in hem serileştirme hem de gerçek dünyada gerçekleşmeyecek olan serileştirme sürecinin kapsamına girmesi gerektiğinden biraz garip. Sorunuzun kullanılması durumunda ifadeler kullanmak yararlıdır (bence). Kodu yazarken aslında kullanma ifadelerini ekledim, ancak cevabı yazarken onları söktüm (beynim FXCop'un şikayet etmesini önlemek için kablolandı). – RichardOD

4

ardından XmlWriterSettings.NewLineHandling (Replace) denemeye değer olurdu - ama bu okuma yardımcı olmayacaktır. Biraz aşınmış, ama belki setter doğrudan bu yapın:

private string text; 
[XmlText] 
public string Text { 
    get { return text; } 
    set 
    { 
     Regex r = new Regex("(?<!\r)\n"); 
     text = r.Replace(value, "\r\n"); 
    } 
} 
+0

Evet, bir regex yerine tek bir çözüm olabileceğini düşünüyordum, ama "daha iyi bir yol" olduğunu umuyordum. [Tm] –

+0

Başka bir yol var, daha iyi olduğunu söyleyemem. kısa sürede cevap ver. – RichardOD

+0

Regex, yalnızca \ r \ n yerine \ n kullanıldığında bulunmanın güzel bir örneğidir. – RichardOD

İlgili konular