@soveckii_fonarik
аспирант,начинающий программист - преподаватель

Как сериализовать список друзей vk используя vknet?

Добрый день. Ковыряю C# и VkNet. В данный момент мне хочется: сохранить список друзей на диск, а при следующем открытии приложения загрузить свежий список друзей и сравнить с тем что записано на диске!
Но у меня что то не совсем получается сделать данную махинацию "красиво". а c костылями делать не хочется )

namespace VkApi
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string> code = () =>
            {
                Console.Write("Please enter code: ");
                string value = Console.ReadLine();
 
                return value;
            };
 
            string login = "*********";
            string pass = "**********";
            Settings scope = Settings.All;
 
 
            var vk = new VkNet.VkApi();
            vk.Authorize(new ApiAuthParams
            {
                ApplicationId = ********,
                Login = login,
                Password = pass,
                Settings = scope
//                TwoFactorAuthorization = code
            });
            var records = vk.Audio.Get(vk.UserId.Value);
            Console.WriteLine("Records count: " + records.Count);
            var friends = vk.Friends.Get(vk.UserId.Value, ProfileFields.FirstName | ProfileFields.LastName);
//            foreach (var friend in friends)
//            {
//                Console.WriteLine(friend.LastName+" "+friend.FirstName);
//                
//            }
            XmlSerializer ser = new XmlSerializer(typeof(FriendList));
            string path = Path.GetRandomFileName();
            FileStream file = new FileStream(path,FileMode.Create,FileAccess.Write,FileShare.None);
            ser.Serialize(file,friends);
            Console.WriteLine("type friends = " + friends.ToString());
 
//            Console.WriteLine("count friends = "+friends.Count);
        }
    }
}


в данный момент ругается на
spoiler

Unhandled Exception: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidCastException: Unable to cast object of type 'System.Collections.ObjectModel.ReadOnlyCollection`1[VkNet.Model.User]' to type 'VkNet.Model.FriendLi
st'.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterFriendList.Write3_FriendList(Object o)
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o, XmlSerializerNamespaces namespaces)
at VkApi.Program.Main(String[] args) in D:\project\NetCore\VkApi\Program.cs:line 55

Подскажите, как правильно это делается ?
  • Вопрос задан
  • 485 просмотров
Пригласить эксперта
Ответы на вопрос 1
DarkRaven
@DarkRaven
разработка программного обеспечения
Ругается, потому что вы серелизатору говорите, что даете ему FriendList, а сами серилизируете коллекцию VkNet.Model.User

Ваш нужно сделать, к примеру список List, заполнить его из friends, затем его серелизировать.

Ну и XmlSerializer(typeof(FriendList)); заменить на XmlSerializer(typeof(List));

UPD. Сниппет из LinqPad

public class UserDTO
{
	public string Text { get; set; }
}

void Main()
{
	var listOfUsers = new List<UserDTO>
	{
		new UserDTO { Text =  "VkUserName" }
	};
	var ser = new System.Xml.Serialization.XmlSerializer(typeof(List<UserDTO>));
	var sb = new StringBuilder();
	var wri = new StringWriter(sb);
	ser.Serialize(wri, listOfUsers);
	sb.ToString().Dump();
}

// Define other methods and classes here
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы