XMLDeserialization을 사용하여 xml 문서를 객체로 역 직렬화 할 수 있습니다. 그러나 XMLElement로 인해 객체를 xml 문서로 직렬화하려고 할 때 막혔습니다!
어떤 아이디어라도 대단히 감사합니다!
편집 : XmlDocument 또는 XDoc을 사용하여이 xml을 구성 할 수 있다는 것을 알고 있지만 직렬화를 수행하려면 기존 클래스를 사용해야합니다.
public class StackOverflow
{
const string XML = @"<?xml version=""1.0""?>
<DietPlan>
<Fruit>fig</Fruit>
<Fruit>Apple</Fruit>
<Fruit>Peach</Fruit>
</DietPlan>";
[XmlRoot(ElementName = "DietPlan")]
public class TestData
{
[XmlAnyElement]
public List<XmlElement> Fruits { get; set; }
}
public static void Deserialize()
{
var ms = new MemoryStream(Encoding.UTF8.GetBytes(XML));
var xs = new XmlSerializer(typeof(TestData));
var obj = (TestData)xs.Deserialize(ms);
}
public static void Serialize()
{
var fruitList = new List<string> { "fig", "Apple", "Peach", };
var testData = new TestData();
//How to populate testData with fruitlist ? (Because it is a list of xmlElements!)
}
}
그것은 기존의 클래스를 수정하는 것은 불가능하고 사용하지 않을 경우 XMLDocument
, XDocument
명시 적으로 XML을 생성하는 등, 여기에 당신이 사용할 수있는 2 개 주요 기술은 다음과 같습니다 :
직렬화에만 사용하는 올바른 XML 속성 및 유형이있는 동반 클래스를 작성하십시오. 즉, 원래 클래스 유형에서 새 유형으로 데이터를 복사 한 다음 새 클래스를 직렬화해야합니다.
원래 클래스 XmlElements
를 사용하고 더미를 사용하여 생성XmlDocument
이 예는 작동중인 두 기술을 보여줍니다.
또한 XML이 UTF-8로 명시 적으로 작성되도록에서 MemoryStream
a를 사용하는 방법에 유의하십시오 StreamWriter
( encoding="UTF-8"
자동으로 입력 됨).
참조 XML에 대한 UTF-8 또는 UTF-16은 기본 인코딩을? ... XML을 인코딩하려는 다양한 방법에 대해 설명합니다.
namespace ConsoleApplication1
{
[XmlRoot(ElementName = "DietPlan")]
public class TestData
{
[XmlAnyElement]
public List<XmlElement> Fruits { get; set; }
}
[XmlRoot(ElementName = "DietPlan")]
public class TestDataForSerialization
{
[XmlElement(ElementName = "Fruit")]
public List<string> Fruits { get; set; }
}
class Program
{
static void Main(string[] args)
{
const string XML = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<DietPlan>
<Fruit>fig</Fruit>
<Fruit>Apple</Fruit>
<Fruit>Peach</Fruit>
</DietPlan>";
var ms = new MemoryStream(Encoding.UTF8.GetBytes(XML));
TestData testdata1 = DeserializeFromStream<TestData>(ms);
TestDataForSerialization testdata2 = DeserializeFromStream<TestDataForSerialization>(ms);
TestData testdata3 = new TestData()
{
Fruits = new List<XmlElement>
{
GetFruitElement("fig"),
GetFruitElement("Apple"),
GetFruitElement("Peach")
}
};
TestDataForSerialization testdata4 = new TestDataForSerialization()
{
Fruits = new List<string> { "fig", "Apple", "Peach" }
};
TestDataForSerialization testdata5 = Convert(testdata1);
MemoryStream msserialized1 = SerializeToStream<TestData>(testdata1);
MemoryStream msserialized2 = SerializeToStream<TestDataForSerialization>(testdata2);
MemoryStream msserialized3 = SerializeToStream<TestData>(testdata3);
MemoryStream msserialized4 = SerializeToStream<TestDataForSerialization>(testdata4);
MemoryStream msserialized5 = SerializeToStream(testdata5);
string xml1 = Encoding.UTF8.GetString(msserialized1.ToArray());
string xml2 = Encoding.UTF8.GetString(msserialized2.ToArray());
string xml3 = Encoding.UTF8.GetString(msserialized3.ToArray());
string xml4 = Encoding.UTF8.GetString(msserialized4.ToArray());
string xml5 = Encoding.UTF8.GetString(msserialized5.ToArray());
TestData testdata_deserialized1 = DeserializeFromStream<TestData>(msserialized1);
TestData testdata_deserialized2 = DeserializeFromStream<TestData>(msserialized2);
TestData testdata_deserialized3 = DeserializeFromStream<TestData>(msserialized3);
TestData testdata_deserialized4 = DeserializeFromStream<TestData>(msserialized4);
TestData testdata_deserialized5 = DeserializeFromStream<TestData>(msserialized5);
TestData testdata_deserialized6 = DeserializeFromString<TestData>(xml1);
TestData testdata_deserialized7 = DeserializeFromString<TestData>(xml2);
TestData testdata_deserialized8 = DeserializeFromString<TestData>(xml3);
TestData testdata_deserialized9 = DeserializeFromString<TestData>(xml4);
TestData testdata_deserialized10 = DeserializeFromString<TestData>(xml5);
}
public static XmlElement GetFruitElement(string fruit)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<Fruit>" + fruit + "</Fruit>");
return doc.DocumentElement;
}
public static TestDataForSerialization Convert(TestData testdata)
{
TestDataForSerialization testdata_toserialize = new TestDataForSerialization();
List<string> fruits = new List<string>();
foreach (XmlElement el in testdata.Fruits)
{
fruits.Add(el.InnerText);
}
testdata_toserialize.Fruits = fruits;
return testdata_toserialize;
}
public static T DeserializeFromStream<T>(MemoryStream ms)
{
ms.Seek(0, SeekOrigin.Begin);
var xs = new XmlSerializer(typeof(T));
var obj = (T)xs.Deserialize(ms);
return obj;
}
public static T DeserializeFromString<T>(string xml)
{
var xs = new XmlSerializer(typeof(TestData));
var sr = new StringReader(xml);
var obj = (T)xs.Deserialize(sr);
return obj;
}
public static MemoryStream SerializeToStream<T>(T testdata)
{
var ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms); // you need to use one of these to get UTF8 output
var xs = new XmlSerializer(typeof(T));
xs.Serialize(sw, testdata);
return ms;
}
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다