MlSerializer: "types 'base.classtest' и 'message1_0.classtest' оба используют имя типа XML" classtest '", когда сериализC#

Место общения программистов C#
Ответить
Anonymous
 MlSerializer: "types 'base.classtest' и 'message1_0.classtest' оба используют имя типа XML" classtest '", когда сериализ

Сообщение Anonymous »

Я работаю с сериализацией XML в C#, где у меня есть несколько версий класса сообщений, которые наследуют друг от друга. < /p>
Вот упрощенная версия моего кода: < /p>
namespace XMLSerializeProblem.Base
{
public class ClassTest : DataModelsBase
{
public string BaseMessage { get; set; } = "Base Message";
}
}

namespace XMLSerializeProblem.Message1_0
{
public class ClassTest : Base.ClassTest
{
public string Message10 { get; set; } = "Message10";
}
}

namespace XMLSerializeProblem.Message1_1
{
public class ClassTest : Message1_0.ClassTest
{
public string Message11 { get; set; } = "Message11";
}
}

< /code>
и Program.cs < /p>
try
{
// Message 1.0
var message1_0 = new Message1_0.ClassTest
{
BaseMessage = "Base Message",
Message10 = "message10"
};

string data1_0 = message1_0.XmlSerialize();
Console.WriteLine(data1_0);

var obj1_0 = (Message1_0.ClassTest)message1_0.XmlDeserialize(data1_0);
Console.WriteLine($"Deserialized: {obj1_0.BaseMessage}, {obj1_0.Message10}");

// Message 1.1
var message1_1 = new Message1_1.ClassTest
{
BaseMessage = "Base Message",
Message10 = "message10",
Message11 = "message11"
};

string data1 = message1_1.XmlSerialize();
var obj1_1 = (Message1_1.ClassTest)message1_1.XmlDeserialize(data1);
Console.WriteLine($"Deserialized: {obj1_1.BaseMessage}, {obj1_1.Message10}, {obj1_1.Message11}");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}

< /code>
и мой метод сериализации XML и детериализации < /p>
#region Protected Method
public string XmlSerialize()
{
XmlSerializer mySerializerWrite = new XmlSerializer(this.GetType());
if (mySerializerWrite == null)
{
return null;
}
MemoryStream myMemoryStream = new MemoryStream();
if (myMemoryStream == null)
{
return null;
}
XmlTextWriter myXmlTextWriter = new XmlTextWriter(myMemoryStream, Encoding.UTF8);
if (myXmlTextWriter == null)
{
return null;
}
mySerializerWrite.Serialize(myXmlTextWriter, this);
myMemoryStream.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(myMemoryStream, Encoding.UTF8);
if (sr == null)
{
return null;
}

string msg = sr.ReadToEnd();
return msg;
}

public object XmlDeserialize(string msg)
{
XmlSerializer serializer = new XmlSerializer(this.GetType());
if (serializer == null)
{
return null;
}
MemoryStream myMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(msg));
if (myMemoryStream == null)
{
return null;
}
object deserializedObject = null;
using (var myXmlTextReader = new XmlTextReader(myMemoryStream)
{
DtdProcessing = DtdProcessing.Ignore,
XmlResolver = null
})
{
if (myXmlTextReader != null)
{
deserializedObject = serializer.Deserialize(myXmlTextReader);
}
}
return deserializedObject;
}
#endregion
< /code>
Проблема < /p>
Когда я запускаю этот код, я получаю следующую ошибку: < /p>
system.invalidoperationException:
types 'xmlserializeprom.base.classtest' и 'xmlserializeprolem.messge.base.classtest' и 'xmlserializeprom.message1_0. Имя типа XML «classtest».
Это происходит, потому что XmlSerializer видит несколько классов с одним и тем же именем типа XML (ClasStest), хотя они находятся в разных пространствах имен. /> xmltype("baseNamespace.classtest")n
→ сериализация работает, но десериализация не сработала с
" не ожидается. »< /p>
[xmlrou но десериализация не сбои с
"не было ожидается." < /p>
[xmltype (namespace = "1_0")]
→ работает для сериализации, но десериализация возвращает NULL, если я не включаю пространство имен в xml. < /p>
xml с explicepace namespace. XML явно включает в себя правильное пространство имен. Хочу:
Каждая версия для правильного сериализации/deserialize.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... use-the-xm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»